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