PHP 5.3 中的命名空間

來源:互聯網
上載者:User

    命名空間是PHP 5.3中最重要的變化,對於C#和Java開發人員對這個詞語非常熟悉了,他們終於可以更好地改變PHP應用程式的結構了。

    為什麼我們需要命名空間?

    隨著你的PHP程式碼程式庫的增長,對之前定義的函數和類名進行修改時風險也更高了,當你試圖增加第三方組件或外掛程式時問題更嚴重,如果存在兩個或兩個以上的代碼集實現了一個“Database”和“User”類會怎麼樣?

    直到目前,唯一的解決辦法是使用長的類/函數名,例如Wordpress在每個類和函數名前都使用了首碼“WP_”, Zend Framework使用了極具描述性的命名規範,導致類名非常冗長,如:

    Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive

    命名衝突問題可以使用命名空間來解決,PHP常量、類和函數可以被組合到命名空間庫中。

    如何定義命名空間?

    預設情況下,所有常量、類和函數名都放在全域空間下,就和PHP支援命名空間之前一樣。

    在PHP檔案的頂部使用一個關鍵字namespace就可以定義命名空間,它必須是第一個命令(declare除外),在它前面不能出現非PHP代碼、HTML或空格。如:

    <?php
    // define this code in the 'MyProject' namespace
     namespace MyProject;
    // ... code ...

    這一行下面的代碼都是指定給MyProject命名空間的,為相同代碼塊嵌套命名空間或定義多個命名空間是不可能的,如果你真這樣幹,只有最後一個命名空間才能識別,但你可以在同一個檔案中定義不同的命名空間代碼,如:

    <?php
    namespace MyProject1;
    // PHP code for the MyProject1 namespace

    namespace MyProject2;
    // PHP code for the MyProject2 namespace

    // Alternative syntax
    namespace MyProject3 {
     // PHP code for the MyProject3 namespace
    }
    ?>

    儘管這麼幹是可以的,但我建議你不要這麼做,最好還是每個檔案中只定義一個命名空間,免得把你弄糊塗了。

    子命名空間

    PHP允許定義具有層次的命名空間以便庫能夠細分,子命名空間使用一個反斜線字元(/)分隔,如:

    ◆MyProject/SubName

    ◆MyProject/Database/MySQL

    ◆CompanyName/MyProject/Library/Common/Widget1

    調用命名空間代碼

    在lib1.php檔案中我們使用App/Lib1 namespace命名空間定義了一個常量、一個函數和一個類,如:

    lib1.php

    <?php
    // application library 1
    namespace App/Lib1;

    const MYCONST = 'App/Lib1/MYCONST';

    function MyFunction() {
     return __FUNCTION__;
    }

    class MyClass {
     static function WhoAmI() {
      return __METHOD__;
     }
    }
    ?>

    現在我們可以在另一個PHP檔案包括這段代碼,如:

    myapp.php

    <?php
    header('Content-type: text/plain');
    require_once('lib1.php');

    echo /App/Lib1/MYCONST . "/n";
    echo /App/Lib1/MyFunction() . "/n";
    echo /App/Lib1/MyClass::WhoAmI() . "/n";
    ?>

    在myapp.php中並沒有定義命名空間,因此這段代碼存在全域空間中,任何對MYCONST、MyFunction和MyClass的直接引用都會失敗,因為它們存在於App/Lib1命名空間中,為了調用lib1.php中的代碼,我們可以在/App/Lib1命名空間前添加首碼定義一個完全合格的名稱,下面是我載入myapp.php時的輸出結果:

    App/Lib1/MYCONST
    App/Lib1/MyFunction
    App/Lib1/MyClass::WhoAmI

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.