好的PHP库离不开一个好的命名空间
好的PHP庫離不開一個好的命名空間概述
命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念,比如在操作系統(tǒng)中,目錄用來將相關(guān)文件分組,對于目錄中的文件來說,目錄就扮演了命名空間的角色。這個原理應(yīng)用到程序設(shè)計領(lǐng)域就是命名空間的概念。PHP 5.3后的版本開始支持命名空間。
定義命名空間
命名空間通過關(guān)鍵字namespace來聲明。任何合法的PHP代碼都可以包含在命名空間中,但只有類、函數(shù)和常量這三種類型受命名空間的影響。
在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的declare語句。命名空間必須是程序腳本的第一條語句,所有非 PHP 代碼包括空白符都不能出現(xiàn)在命名空間的聲明之前。同一個命名空間可以定義在多個文件中。
定義子命名空間
與目錄和文件的關(guān)系相似,PHP也允許指定層次化的命名空間。
在同一個文件中定義多個命名空間
PHP支持這種語法,但不提倡使用。在同一個文件中定義多個命名空間有兩種語法形式:一種是簡單的上下羅列,一種是使用大括號形式的語法。建議使用第二種。
<?php declare(encoding = 'UTF-8'); namespace MyProject {/* MyProject */ } namespace {/* global */ }將全局的非命名空間中的代碼與命名空間中的代碼組合在一起,只能使用大括號形式的語法。南通長牌游戲大廳 http://www.szjmswy.com/
使用命名空間:基礎(chǔ)
要使用命名空間,必須了解PHP是如何知道要使用哪一個命名空間中的元素的。
在文件系統(tǒng)中,訪問一個文件有三種方式:
- 相對文件名形式
- 相對路徑名形式
- 絕對路徑名形式
與文件系統(tǒng)相似,在PHP命名空間中,類名可以通過三種方式引用,需要了解一下命名空間名稱定義:
- 非限定名稱,不包含前綴的類名稱。名稱中不包含命名空間分隔符的標(biāo)識符。例如Foo。
- 限定名稱,包含前綴的名稱,名稱中含有命名空間分隔符的標(biāo)識符。例如Foo\Bar。
- 完全限定名稱,包含了全局前綴操作符的名稱。名稱中包含命名空間分隔符,并一命名空間分隔符開始的標(biāo)識符。例如\Foo\Bar。namespace\Foo也是一個完全限定名稱。
命名空間和動態(tài)語言特征
命名空間的實現(xiàn)受到語言自身的動態(tài)特征的影響,有時必須使用完全限定名稱。
namespace關(guān)鍵字和__NAMESPACE__常量
常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個空的字符串。常量__NAMESPACE__在動態(tài)創(chuàng)建名稱時很有用。
關(guān)鍵字namespace可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價于類中的self操作符。
使用命名空間:別名/導(dǎo)入
允許通過別名引用或?qū)胪獠康耐耆薅Q,類似于在類unix文件系統(tǒng)中可以創(chuàng)建對其它的文件或目錄的符號連接。
PHP命名空間支持兩種別名或?qū)敕绞?#xff1a;
- 為類名稱使用別名
- 為命名空間名稱使用別名
使用use操作符導(dǎo)入或使用別名,支持一行包含多個use語句。注意對命名空間中的名稱,前導(dǎo)的反斜杠是不必要的也不允許有反斜杠,因為導(dǎo)入的名稱必須是完全限定的,不會根據(jù)當(dāng)前的命名空間作相對解析。
全局空間
若未定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間。在名稱前加上前綴\,表示該名稱是全局空間中的名稱。
使用命名空間:后備全局函數(shù)/常量
在命名空間中,當(dāng)PHP遇到一個非限定的類、函數(shù)或常量名稱時,將會使用不同的有線策略來解析該名稱。
類名稱總是解析到當(dāng)前命名空間中的名稱,因此在訪問系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時,必須使用完全限定名稱。
對于函數(shù)和常量來說,如果當(dāng)前命名空間中不存在該函數(shù)或常量,PHP 會退而使用全局空間中的函數(shù)或常量。
名稱解析規(guī)則
名稱解析規(guī)則文字挺多的,需要具體問題具體分析。
(全文完)
總結(jié)
以上是生活随笔為你收集整理的好的PHP库离不开一个好的命名空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 家里没什么菜的飞鸽传书
- 下一篇: 掌握这7点,不懂代码也能做出酷炫可视化大