php命名空間的一個(gè)最明確的作用是解決重名問(wèn)題,PHP中不允許兩個(gè)函數(shù)或者類(lèi)出現(xiàn)相同的名字,否則會(huì)產(chǎn)生一個(gè)致命的錯(cuò)誤。php官網(wǎng)已很明確的進(jìn)行了定義并形象化解釋?zhuān)@里直接從php官網(wǎng)copy一段文字:從廣義上來(lái)說(shuō),命名空間是一種封裝事物的方法。在很多地方都可以見(jiàn)到這種抽象概念。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組,對(duì)于目錄中的文件來(lái)說(shuō),它就扮演了命名空間的角色。具體舉個(gè)例子,文件 foo.txt 可以同時(shí)在目錄/home/greg 和 /home/other 中存在,但在同一個(gè)目錄中不能存在兩個(gè) foo.txt 文件。另外,在目錄 /home/greg 外訪問(wèn) foo.txt 文件時(shí),我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念。
php命名空間引入namespace關(guān)鍵字就是為了解決php面向?qū)ο缶幊踢^(guò)程中已出現(xiàn)的各種“麻煩”;具體麻煩如下:
用戶(hù)編寫(xiě)的代碼與PHP內(nèi)部的類(lèi)/函數(shù)/常量或第三方類(lèi)/函數(shù)/常量之間的名字沖突。
為了緩解麻煩1,通常編寫(xiě)各種class時(shí)會(huì)使用較長(zhǎng)的類(lèi)名或?yàn)閷?shí)現(xiàn)不同功能的class添加名稱(chēng)前綴(或后綴)。
不使用魔法函數(shù)__autoload的情況下,而每個(gè)class又獨(dú)占一個(gè)php文件時(shí),為了調(diào)用不同的class,會(huì)在使用這些class的另外的php文件的開(kāi)頭位置書(shū)寫(xiě)較多的include(或require或require_once)語(yǔ)句。
我們先創(chuàng)建命名空間,同一腳本文件中可以創(chuàng)建多個(gè)命名空間。
其代碼如下所示:
//創(chuàng)建一個(gè)名為'Article'的命名空間
namespace Article;
//此Comment屬于Article空間的元素
class Comment { }
//創(chuàng)建一個(gè)名為'MessageBoard'的命名空間
namespace MessageBoard;
//此Comment屬于MessageBoard空間的元素
class Comment { }
?>
在不同空間之間不可以直接調(diào)用其它元素,需要使用命名空間的語(yǔ)法。
其示例代碼如下所示:
namespace Article;
class Comment { }
namespace MessageBoard;
class Comment { }
//調(diào)用當(dāng)前空間 (MessageBoard)的Comment類(lèi)
$comment = new Comment();
//調(diào)用Article空間的Comment類(lèi)
$article_comment = new \Article\Comment();
?>
可以看到,在MessageBoard空間中調(diào)用article空間里的Comment類(lèi)時(shí),使用了一種像文件路徑的語(yǔ)法: \空間名\元素名
除了類(lèi)之外,對(duì)函數(shù)和常量的用法是一樣的,下面我為兩個(gè)空間創(chuàng)建了新的元素,并在MessageBoard空間中輸出了它們的值。
其代碼如下:
namespace Article;
const PATH = '/article';
function getCommentTotal() {
return 100;
}
class Comment { }
namespace MessageBoard;
const PATH = '/message_board';
function getCommentTotal() {
return 300;
}
class Comment { }
//調(diào)用當(dāng)前空間的常量、函數(shù)和類(lèi)
echo PATH; //message_board
echo getCommentTotal(); //300
$comment = new Comment();
//調(diào)用Article空間的常量、函數(shù)和類(lèi)
echo \Article\PATH; //article
echo \Article\getCommentTotal(); //100
$article_comment = new \Article\Comment();
?> ?>
就得到如下的結(jié)果: /message_board300/article100