回覆列表
  • 1 # lanfengkd

    名稱空間一個最明確的目的就是解決重名問題,PHP中不允許兩個函式或者類出現相同的名字,否則會產生一個致命的錯誤。這種情況下只要避免命名重複就可以解決,最常見的一種做法是約定一個字首。

    舉個栗子:專案中有兩個模組:article和message board,它們各自有一個處理使用者留言的類Comment。之後我可能想要增加對所有使用者留言的一些資訊統計功能,比如說我想得到所有留言的數量。這時候呼叫它們Comment提供的方法是很好的做法,但是同時引入各自的Comment類顯然是不行的,程式碼會出錯,在另一個地方重寫任何一個Comment也會降低維護性。那這時只能重構類名,我約定了一個命名規則,在類名前面加上模組名,像這樣:Article_Comment、MessageBoard_Comment

    可以看到,名字變得很長,那意味著以後使用Comment的時候會寫上更多的程式碼(至少字元多了)。並且,以後如果要對各個模組增加更多的一些整合功能,或者是互相呼叫,發生重名的時候就需要重構名字。當然在專案開始的時候就注意到這個問題,並規定命名規則就能很好的避免這個問題。另一個解決方法可以考慮使用名稱空間。

    基礎

    名稱空間將程式碼劃分出不同的空間(區域),每個空間的常量、函式、類(為了偷懶,我下邊都將它們稱為元素)的名字互不影響, 這個有點類似我們常常提到的‘封裝"的概念。

    建立一個名稱空間需要使用namespace關鍵字,這樣:

    複製程式碼程式碼如下:

    //建立一個名為"Article"的名稱空間

    namespace Article;

    ?>

    要注意的是,當前指令碼檔案的第一個名稱空間前面不能有任何程式碼,下面的寫法都是錯誤的:

    複製程式碼程式碼如下:

    //例一

    //在指令碼前面寫了一些邏輯程式碼

    $path = "/";

    class Comment { }

    namespace Article;

    ?>

    //例二

    //在指令碼前面輸出了一些字元

    namespace Article;

    ?>

    為什麼要說第一個名稱空間呢?因為同一指令碼檔案中可以建立多個名稱空間。

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

    複製程式碼程式碼如下:

    //建立一個名為"Article"的名稱空間

    namespace Article;

    //此Comment屬於Article空間的元素

    class Comment { }

    //建立一個名為"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類時,使用了一種像檔案路徑的語法: \空間名\元素名

    除了類之外,對函式和常量的用法是一樣的,下面我為兩個空間建立了新的元素,並在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();

    ?>

    然後我的確得到了Article空間的元素資料。

    子空間

    名稱空間的呼叫語法像檔案路徑一樣是有道理的,它允許我們自定義子空間來描述各個空間之間的關係。

  • 中秋節和大豐收的關聯?
  • 夢幻隔山打牛的浮石怎麼組合?