php.net
(PHP 5 >= 5.3.0, PHP 7)
定義命名空間
雖然任意合法的PHP代碼都可以包含在命名空間中,但只有以下類型的代碼受命名空間的影響,它們是:類(包括抽象類別和traits)、介面、函數和常量。
如果一個檔案中包含命名空間,它必須在其它所有代碼之前聲明命名空間,除了一個以外:declare關鍵字。所有非 PHP 程式碼封裝括空白符都不能出現在命名空間的聲明之前。
同一個命名空間可以定義在多個檔案中,即允許將同一個命名空間的內容分割存放在不同的檔案中。
定義子命名空間
在同一個檔案中定義多個命名空間
註:在實際的編程實踐中,非常不提倡在同一個檔案中定義多個命名空間!
使用命名空間
類名的三種引用方式:
非限定名稱(名稱中不包含命名空間分隔字元的標識符),或不包含首碼的類名稱。例如 $a=new foo(); 或 foo::staticmethod();。如果當前命名空間是 currentnamespace,foo 將被解析為 currentnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,則 foo 會被解析為foo。* *警告**:如果命名空間中的函數或常量未定義,則該非限定的函數名稱或常量名稱會被解析為全域函數名稱或常量名稱。
限定名稱(名稱中含有命名空間分隔字元的標識符),或包含首碼的名稱,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果當前的命名空間是 currentnamespace,則 foo 會被解析為 currentnamespace\subnamespace\foo。如果使用 foo 的代碼是全域的,不包含在任何命名空間中的代碼,foo 會被解析為subnamespace\foo。
完全限定名稱(名稱中包含命名空間分隔字元,並以命名空間分隔字元開始的標識符),或包含了全域首碼操作符的名稱。訪問任意全域類、函數或常量,都可以使用完全限定名稱,例如 \strlen() 或 \Exception 。
tips:
$a = '\namespacename\classname';$obj = new $a; $a = 'namespacename\classname';$obj = new $a;$b = 'namespacename\funcname';$b(); // prints namespacename\funcname$b = '\namespacename\funcname';$b(); // also prints namespacename\funcname
使用相關常量
常量__NAMESPACE__的值是包含當前命名空間名稱的字串。在全域的,不包括在任何命名空間中的代碼,它包含一個空的字串。
使用命名空間:別名/匯入
類名稱總是解析到當前命名空間中的名稱。因此在訪問系統內部或不包含在命名空間中的類名稱時,必須使用完全限定名稱。