PHP命名空間的做用、爲何使用命名空間?

      命名空間一個最明確的目的就是解決重名問題,PHP中不容許兩個函數或者類出現相同的名字,不然會產生一個致命的錯誤。這種狀況下只要避免命名重複就能夠解決,最多見的一種作法是約定一個前綴。php

      舉個栗子:項目中有兩個模塊:article和message board,它們各自有一個處理用戶留言的類Comment。以後我可能想要增長對全部用戶留言的一些信息統計功能,好比說我想獲得全部留言的數量。這時候調用它們Comment提供的方法是很好的作法,可是同時引入各自的Comment類顯然是不行的,代碼會出錯,在另外一個地方重寫任何一個Comment也會下降維護性。那這時只能重構類名,我約定了一個命名規則,在類名前面加上模塊名,像這樣:Article_Comment、MessageBoard_Commenthtml

能夠看到,名字變得很長,那意味着之後使用Comment的時候會寫上更多的代碼(至少字符多了)。而且,之後若是要對各個模塊增長更多的一些整合功能,或者是互相調用,發生重名的時候就須要重構名字。固然在項目開始的時候就注意到這個問題,並規定命名規則就能很好的避免這個問題。另外一個解決方法能夠考慮使用命名空間。函數

  

基礎
命名空間將代碼劃分出不一樣的空間(區域),每一個空間的常量、函數、類(爲了偷懶,我下邊都將它們稱爲元素)的名字互不影響, 這個有點相似咱們經常提到的‘封裝'的概念。spa

建立一個命名空間須要使用namespace關鍵字,這樣:
code

複製代碼代碼以下:

<?php

 

//建立一個名爲'Article'的命名空間
namespace Article;htm

?>get


要注意的是,當前腳本文件的第一個命名空間前面不能有任何代碼,下面的寫法都是錯誤的:it

複製代碼代碼以下:

//例一
//在腳本前面寫了一些邏輯代碼

 

<?phpio

$path = "/";function

class Comment { }

namespace Article;

?>

 

//例二
//在腳本前面輸出了一些字符

<html></html>
<?php

namespace Article;

?>


爲何要說第一個命名空間呢?由於同一腳本文件中能夠建立多個命名空間。

 

下面我建立了兩個命名空間,順便爲這兩個空間各自添加了一個Comment類元素:

複製代碼代碼以下:

<?php

 

//建立一個名爲'Article'的命名空間
namespace Article;

//此Comment屬於Article空間的元素
class Comment { }


//建立一個名爲'MessageBoard'的命名空間
namespace MessageBoard;

//此Comment屬於MessageBoard空間的元素
class Comment { }
?>


在不一樣空間之間不能夠直接調用其它元素,須要使用命名空間的語法:

複製代碼代碼以下:

<?php

 

namespace Article;

class Comment { }


namespace MessageBoard;

class Comment { }

//調用當前空間(MessageBoard)的Comment類
$comment = new Comment();

//調用Article空間的Comment類
$article_comment = new \Article\Comment();

?>


能夠看到,在MessageBoard空間中調用article空間裏的Comment類時,使用了一種像文件路徑的語法: \空間名\元素名

 

除了類以外,對函數和常量的用法是同樣的,下面我爲兩個空間建立了新的元素,並在MessageBoard空間中輸出了它們的值。

複製代碼代碼以下:

<?php

 

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();

?>


而後個人確獲得了Article空間的元素數據。

 


子空間命名空間的調用語法像文件路徑同樣是有道理的,它容許咱們自定義子空間來描述各個空間之間的關係。

相關文章
相關標籤/搜索