很多語(yǔ)言都提供了名稱空間特性,包括 C++ 和 Java? 編程語(yǔ)言。引入名稱空間是為了幫助組織大型的代碼庫(kù),因?yàn)樵诖笮痛a庫(kù)中,應(yīng)用程序經(jīng)常會(huì)出現(xiàn)函數(shù)名或類名重疊問(wèn)題,這會(huì)引起其他問(wèn)題。使用名稱空間可以幫助識(shí)別代碼提供的函數(shù)或?qū)嵱贸绦?,甚至可以幫助指定其?lái)源。一個(gè)例子就是 C# 中的 System 名稱空間,它包含有 .NET 框架提供的所有函數(shù)和類。
在其他未提供正式名稱空間的語(yǔ)言中(比如 PHP V5.2 以及更早版本),人們常常通過(guò)在類或函數(shù)名中使用特定的命名約定來(lái)發(fā)揮名稱空間的作用。比如 Zend Framework,其中每個(gè)類名以 Zend 開(kāi)頭,并且每個(gè)子名稱空間使用下劃線分隔開(kāi)。比如,類定義 Zend_Db_Table 表示 Zend Framework 中的一個(gè)類并且提供數(shù)據(jù)庫(kù)功能。這種方法的一個(gè)缺點(diǎn)就是產(chǎn)生的代碼非常繁瑣,尤其是那些包含好幾層的類或函數(shù)(Zend Framework 中的 Zend_Cache_Backend_Apc 就是一個(gè)例子)。另一個(gè)問(wèn)題就是所有代碼必須遵循這種風(fēng)格,因此如果在應(yīng)用程序中集成了不遵循這種命名約定的第三方代碼后,問(wèn)題就復(fù)雜了。
PHP 名稱空間的發(fā)展也并非一帆風(fēng)順。它們最初計(jì)劃引入到 PHP V5 中,但是由于無(wú)法獲得恰當(dāng)?shù)膶?shí)現(xiàn),因此在開(kāi)發(fā)階段被放棄。最后決定將它們并入到 PHP V6 中,在 2007 年決定將所有 nonunicode 增強(qiáng)移到另一個(gè) PHP V5.x 發(fā)行版后,名稱空間隨后被移入到 PHP V5.3 中。盡管自最初的設(shè)計(jì)之后絕大部分名稱空間行為沒(méi)有發(fā)生變化,但是使用哪一種操作符卻成了最大的問(wèn)題,并且社區(qū)成員對(duì)這個(gè)問(wèn)題有不同的看法。2008 年 10 月最終決定使用反斜杠作為操作符,從而解決了所有在語(yǔ)言設(shè)計(jì)和適用性方面使用各種其他操作符的問(wèn)題。
PHP 名稱空間
PHP 從其他語(yǔ)言中借鑒了很多名稱空間的語(yǔ)法和設(shè)計(jì) – 最突出的是 C++.然而,PHP 名稱空間在某些方面具有自己的獨(dú)特性,這對(duì)于希望像在其他語(yǔ)言中那樣使用名稱空間的用戶來(lái)說(shuō)是一個(gè)挑戰(zhàn)。在本節(jié)中,我們將研究 PHP 名稱空間的工作方式。
定義一個(gè)名稱空間
定義一個(gè)新的名稱空間非常簡(jiǎn)單。要定義新名稱空間,在一個(gè)文件中添加清單 1 中的代碼作為第一個(gè)命令或輸出。
清單 1. 定義名稱空間
1