命名空間是PHP 5.3中最重要的變化,對(duì)于C#和Java開發(fā)人員對(duì)這個(gè)詞語非常熟悉了,他們終于可以更好地改變PHP應(yīng)用程序的結(jié)構(gòu)了。
為什么我們需要命名空間?
隨著你的PHP代碼庫(kù)的增長(zhǎng),對(duì)之前定義的函數(shù)和類名進(jìn)行修改時(shí)風(fēng)險(xiǎn)也更高了,當(dāng)你試圖增加第三方組件或插件時(shí)問題更嚴(yán)重,如果存在兩個(gè)或兩個(gè)以上的代碼集實(shí)現(xiàn)了一個(gè)“Database”和“User”類會(huì)怎么樣?
直到目前,唯一的解決辦法是使用長(zhǎng)的類/函數(shù)名,例如Wordpress在每個(gè)類和函數(shù)名前都使用了前綴“WP_”, Zend Framework使用了極具描述性的命名約定,導(dǎo)致類名非常冗長(zhǎng),如:
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive
命名沖突問題可以使用命名空間來解決,PHP常量、類和函數(shù)可以被組合到命名空間庫(kù)中。
如何定義命名空間?
默認(rèn)情況下,所有常量、類和函數(shù)名都放在全局空間下,就和PHP支持命名空間之前一樣。
在PHP文件的頂部使用一個(gè)關(guān)鍵字namespace就可以定義命名空間,它必須是第一個(gè)命令(declare除外),在它前面不能出現(xiàn)非PHP代碼、HTML或空格。如:
< ?php // define this code in the 'MyProject' namespace namespace MyProject; // ... code ... 這一行下面的代碼都是指定給MyProject命名空間的,為相同代碼塊嵌套命名空間或定義多個(gè)命名空間是不可能的,如果你真這樣干,只有最后一個(gè)命名空間才能識(shí)別,但你可以在同一個(gè)文件中定義不同的命名空間代碼,如:
< ?php namespace MyProject1; // PHP code for the MyProject1 namespace namespace MyProject2; // PHP code for the MyProject2 namespace // Alternative syntax namespace MyProject3 { // PHP code for the MyProject3 namespace } ?> 盡管這么干是可以的,但我建議你不要這么做,最好還是每個(gè)文件中只定義一個(gè)命名空間,免得把你弄糊涂了。
子命名空間
PHP允許定義具有層次的命名空間以便庫(kù)能夠細(xì)分,子命名空間使用一個(gè)反斜線字符(\)分隔,如:
◆MyProject\SubName
◆MyProject\Database\MySQL
◆CompanyName\MyProject\Library\Common\Widget1
調(diào)用命名空間代碼
在lib1.php文件中我們使用App\Lib1 namespace命名空間定義了一個(gè)常量、一個(gè)函數(shù)和一個(gè)類,如:
lib1.php
< ?php // application library 1 namespace App\Lib1; const MYCONST = 'App\Lib1\MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } ?> 現(xiàn)在我們可以在另一個(gè)PHP文件包括這段代碼,如:
myapp.php
< ?php header('Content-type: text/plain'); require_once('lib1.php'); echo \App\Lib1\MYCONST . "\n"; echo \App\Lib1\MyFunction() . "\n"; echo \App\Lib1\MyClass::WhoAmI() . "\n"; ?> 在myapp.php中并沒有定義命名空間,因此這段代碼存在全局空間中,任何對(duì)MYCONST、MyFunction和MyClass的直接引用都會(huì)失敗,因?yàn)樗鼈兇嬖谟贏pp\Lib1命名空間中,為了調(diào)用lib1.php中的代碼,我們可以在\App\Lib1命名空間前添加前綴定義一個(gè)完全合格的名稱,下面是我載入myapp.php時(shí)的輸出結(jié)果:
App\Lib1\MYCONST App\Lib1\MyFunction App\Lib1\MyClass::WhoAmI 完全合格名稱可以變得很長(zhǎng),定義長(zhǎng)名稱,如App-Lib1-MyClass,有一些明顯的好處。
原文:How to Use PHP Namespaces, Part 1: The Basics
作者:Craig Buckler
本文作者:未知如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇