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