PHP命名空間

從PHP5.3開始,PHP加入namespace關鍵字,與其他面嚮對象語言一樣,解決了多文件之間的類、常量、函數的命名衝突。

定義

PHP支持兩種方式的命名空間書寫方式。建議多個命名空間在同一個文件中時,用大括號包裹起來。

<code>//方式一
namespace MyProject;
/**以下為代碼*/
const TEST_CONST = 1;
function test(){
}
class TestClass {
}
namespace MyProject1;
const TEST_CONST = 2;
function test1(){
}
class TestClass1 {
}/<code>
<code>//方式二
namespace MyProject {
const TEST_CONST = 1;
function test(){
}
class TestClass {
}
}
namespace OtherProject {
const TEST_CONST = 2;
function test(){
}
class TestClass {
}
}/<code>

在這裡要注意的是,一個PHP文件中,如果出現了命名空間那麼namespace一定要出現在最前面,也就是第二行,有且僅有declare語句可以出現在它前面(但在開發模式下會提示warning)。例如:

PHP命名空間

子命名空間

為了更好的層次化命名,PHP可以使用子命名空間來定義。

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。
  • 完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new \\currentnamespace\\foo(); 或 \\currentnamespace\\foo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespace\\foo。

我們通過例子來了解,在同一文件夾內有兩個文件test1.php,test.php。

PHP命名空間

test1.php

PHP命名空間

test.php

PHP命名空間

輸出結果

當前目錄下的所有文件都是以文件夾為命名空間,文件名為類名時,我可以使用PHP動態創建的優勢,自動載入類。

PHP命名空間


分享到:


相關文章: