PHP 5.3新特性命名空間規(guī)則解析及高級功能
日前發(fā)布的PHP 5.3中,最重要的一個新特性就是命名空間的加入。本文介紹了PHP命名空間的一些術(shù)語,其解析規(guī)則,以及一些高級功能的應(yīng)用,希望能夠幫助讀者在項目中真正使用命名空間。
在這里中我們介紹了PHP命名空間的用途和namespace關(guān)鍵字,在這篇文章中我們將介紹一下use命令的使用以及PHP如何解析命名空間的名字的。
為了便于對比,我定義了兩個幾乎一樣的代碼塊,只有命名空間的名字不同。
|
|
開始之前先要理解幾個PHP命名空間相關(guān)術(shù)語。
◆完全限定名稱(Fully-qualified name)
任何PHP代碼都可以引用完全限定名稱,它是一個以命名空間反斜線開頭的標(biāo)識符,如\App\Lib1\MYCONST,\App\Lib2\MyFunction( )等。
完全限定名稱是沒有任何歧義的,開頭的反斜線和文件路徑的作用有點類似,它表示“根”全局空間,如果我們在全局空間中實現(xiàn)了一個不同的MyFunction( ),可以使用\MyFunction( )從lib1.php或lib2.php調(diào)用它。
完全限定名稱對一次性函數(shù)調(diào)用或?qū)ο蟪跏蓟浅S杏茫?dāng)你產(chǎn)生了大量的調(diào)用時它們就沒有實用價值了,在下面的討論中我們將會看到,PHP提供了其它選項以解除我們?yōu)槊臻g打字的煩惱。
◆限定名稱(Qualified name)
至少有一個命名空間分隔符的標(biāo)識符,如Lib1\MyFunction( )。
◆非限定名稱(Unqualified name)
沒有命名空間分隔符的標(biāo)識符,如MyFunction( )。
在相同的命名空間內(nèi)工作
仔細(xì)思考下面的代碼:
myapp1.php
|
即使我們同時包括了lib1.php和lib2.php,MYCONST,MyFunction和MyClass標(biāo)識符只能在lib1.php中引用,這是因為myapp1.php的代碼在相同的App\Lib1命名空間內(nèi)。
執(zhí)行結(jié)果:
- App\Lib1\MYCONST
- App\Lib1\MyFunction
- App\Lib1\MyClass::WhoAmI
命名空間導(dǎo)入
可以使用use操作符導(dǎo)入命名空間,如:
myapp2.php
< ?php
|
可以定義任意數(shù)量的use語句,或使用逗號分隔成獨立的命名空間,在這個例子中我們導(dǎo)入了App\Lib2命名空間,但我們?nèi)匀徊荒苤苯右?MYCONST,MyFunction和MyClass,因為我們的代碼還在全局空間中,但如果我們添加了“Lib2\”前綴,它們就變成限定名稱 了,PHP將會搜索導(dǎo)入的命名空間,直到找到匹配項。
執(zhí)行結(jié)果:
- App\Lib2\MYCONST
- App\Lib2\MyFunction
- App\Lib2\MyClass::WhoAmI
命名空間別名
命名空間別名可能是最有用的構(gòu)想了,別名允許我們使用較短的名稱引用很長的命名空間。
myapp3.php
|
第一個use語句將App\Lib1定義為“L”,任何使用“L”的限定名稱在編譯時都會被翻譯成“App\Lib1”,因此我們就可以引用L\MYCONST和L\MyFunction而不是完全限定名稱了。
第二個use語句定義了“obj”作為App\Lib2\命名空間中MyClass類的別名,這種方式只適合于類,不能用于常量和函數(shù),現(xiàn)在我們就可以使用new Obj( )或象上面那樣運(yùn)行靜態(tài)方法了。
執(zhí)行結(jié)果:
- App\Lib1\MYCONST
- App\Lib1\MyFunction
- App\Lib1\MyClass::WhoAmI
- App\Lib2\MyClass::WhoAmI
PHP命名解析規(guī)則
PHP標(biāo)識符名稱使用下列命名空間規(guī)則進(jìn)行解析,請參考PHP用戶手冊了解更詳細(xì)的信息:
1.在編譯時調(diào)用完全限定函數(shù)、類或常量;
2.非限定名稱和限定名稱根據(jù)導(dǎo)入規(guī)則進(jìn)行翻譯,例如,如果A\B\C導(dǎo)入為C,調(diào)用C\D\e( )就會被翻譯成A\B\C\D\e( );
3.在PHP命名空間內(nèi),所有限定名稱尚未根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換,例如,如果在命名空間A\B中調(diào)用C\D\e( ),那么會被翻譯成A\B\C\D\e( );
4.非限定類名稱根據(jù)當(dāng)前的導(dǎo)入規(guī)則進(jìn)行轉(zhuǎn)換,使用全名替換導(dǎo)入的短名稱,例如,如果類C在命名空間A\B中被導(dǎo)入為X,那么new X( )就會被翻譯為new A\B\C( );
5.在命名空間中非限定函數(shù)調(diào)用在運(yùn)行時解析,例如,如果MyFunction( )在命名空間A\B中被調(diào)用,PHP首先會查找函數(shù)\A\B\MyFunction( ),如果沒有找到,然后會在全局空間中查找\MyFunction( );
6.調(diào)用非限定或限定類名在運(yùn)行時被解析,例如,如果我們在命名空間A\B中調(diào)用new C( ),PHP將會查找類A\B\C,如果沒有找到,PHP會嘗試自動載入A\B\C。
PHP命名空間高級特性
接下來讓我們看一看PHP命名空間的一些高級特性。
__NAMESPACE__常量
__NAMESPACE__是一個PHP字符串,它總是返回當(dāng)前命名空間的名稱,在全局空間中它是一個空字符串。
|
這個值在調(diào)試時非常有用,它也可由于動態(tài)生成一個完全限定類名,如:
|
namespace關(guān)鍵字
namespace關(guān)鍵字可以用于明確引用一個當(dāng)前命名空間或子命名空間中的項目,它等價于類中的self命名空間:
|
自動載入命名空間類
PHP 5中最省時省力的特性是自動載入,在全局(非命名空間)PHP代碼中,可以寫一個標(biāo)準(zhǔn)自動載入函數(shù):
|
在PHP 5.3中,你可以創(chuàng)建一個命名空間類的實例,在這種情況下,完全限定命名空間和類名傳遞給__autoload函數(shù),例如,$class_name的值可 能是App\Lib1\MyClass。你可以在相同的文件夾下放置所有的PHP類文件,從字符串中提取命名空間,但那樣會導(dǎo)致文件名沖突。
另外,你的類文件層次結(jié)構(gòu)會按照命名空間的結(jié)構(gòu)重新組織,例如,MyClass.php文件可以創(chuàng)建在/classes/App/Lib1文件夾下:
/classes/App/Lib1/MyClass.php
|
在根文件夾下的文件就使用下面的代碼了:
myapp.php
|
解釋:
1.類App\Lib1\MyClass的別名是MC;
2. new MC( )在編譯時被翻譯成new App\Lib1\MyClass( );
3.字符串App\Lib1\MyClass被傳遞給__autoload函數(shù),使用文件路徑正斜線替換所有命名空間中的反斜線,然后修改字符串,classes\App\Lib1\MyClass.php文件被自動載入;
總結(jié)
有關(guān)PHP命名空間的使用就介紹到這里,希望您能夠?qū)HP的命名空間有一個新的認(rèn)識,并希望你能在新項目中真正使用命名空間。
- PHP命名空間(Namespace)的使用詳解
- PHP命名空間(namespace)的動態(tài)訪問及使用技巧
- PHP命名空間和自動加載類
- PHP中的命名空間詳細(xì)介紹
- PHP動態(tài)地創(chuàng)建屬性和方法, 對象的復(fù)制, 對象的比較,加載指定的文件,自動加載類文件,命名空間
- PHP命名空間(namespace)的使用基礎(chǔ)及示例
- PHP命名空間(Namespace)簡明教程
- PHP自動加載autoload和命名空間的應(yīng)用小結(jié)
- thinkphp命名空間用法實例詳解
- PHP命名空間與自動加載類詳解
- PHP 面向?qū)ο蟪绦蛟O(shè)計(oop)學(xué)習(xí)筆記 (五) - PHP 命名空間
- PHP命名空間namespace的定義方法詳解
- PHP 命名空間原理與用法詳解
相關(guān)文章
php輸出echo、print、print_r、printf、sprintf、var_dump的區(qū)別比較
本篇文章是對php輸出echo、print、print_r、printf、sprintf、var_dump的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP下操作Linux消息隊列完成進(jìn)程間通信的方法
當(dāng)我們開發(fā)的系統(tǒng)需要使用多進(jìn)程方式運(yùn)行時,進(jìn)程間通信便成了至關(guān)重要的環(huán)節(jié)。消息隊列(message queue)是Linux系統(tǒng)進(jìn)程間通信的一種方式。2010-07-07PHP實現(xiàn)二叉樹的深度優(yōu)先與廣度優(yōu)先遍歷方法
這篇文章主要介紹了PHP實現(xiàn)二叉樹的深度優(yōu)先與廣度優(yōu)先遍歷方法,涉及php針對二叉樹進(jìn)行遍歷的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09php基于登陸時間判斷實現(xiàn)一天多次登錄只積分一次功能示例
這篇文章主要介紹了php基于登陸時間判斷實現(xiàn)一天多次登錄只積分一次功能,適合會員系統(tǒng)的積分功能,涉及php時間判斷與數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2017-10-10