名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題。
用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
1、定義命名空間
使用namespace關鍵詞來定義命名空間,使用反斜杠”\”作為分隔符。
如:
namespace mytest;
namespace mytest\spacex;
namespace mytest2\spacexx\xxx;
2、使用命名空間
use My\Full\Classname;
use My\Full\Classname as Another, My\Full\NSname;
3、PHP命名空間動態特性
在use指令后面不能使用變量或常量。
調用類時,類名及類名前的命名空間可以是變量構成。
namespace np1\np2;
class Cls{
public static function test() {
print "test namespace\n";
}
public function test2(){
print "test namespace 2\n";
}
}
namespace B;
\np1\np2\Cls::test();
//np1\np2\Cls::test(); //錯誤,這里是調用\B\np1\np2\Cls::test()
$cls = "\\np1\\np2\\Cls";
$cls::test();
$obj = new $cls();
$obj->test2();
4、名稱解析遵循下列規則:
1、對完全限定名稱的函數,類和常量的調用在編譯時解析。例如 new \A\B 解析為類 A\B。
2、所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的導入規則在編譯時進行轉換。例如,如果命名空間 A\B\C 被導入為 C,那么對 C\D\e() 的調用就會被轉換為 A\B\C\D\e()。
3、在命名空間內部,所有的沒有根據導入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間 A\B 內部調用 C\D\e(),則 C\D\e() 會被轉換為 A\B\C\D\e() 。
4、非限定類名根據當前的導入規則在編譯時轉換(用全名代替短的導入名稱)。例如,如果命名空間 A\B\C 導入為C,則 new C() 被轉換為 new A\B\C() 。
5、在命名空間內部(例如A\B),對非限定名稱的函數調用是在運行時解析的。例如對函數 foo() 的調用是這樣解析的:
1)在當前命名空間中查找名為 A\B\foo() 的函數
2)嘗試查找并調用 全局(global) 空間中的函數 foo()。
6、在命名空間(例如A\B)內部對非限定名稱或限定名稱類(非完全限定名稱)的調用是在運行時解析的。下面是調用 new C() 及 new D\E() 的解析過程: new C()的解析:
1)在當前命名空間中查找A\B\C類。
2)嘗試自動裝載類A\B\C。
new D\E()的解析:
1)在類名稱前面加上當前命名空間名稱變成:A\B\D\E,然后查找該類。
2)嘗試自動裝載類 A\B\D\E。
為了引用全局命名空間中的全局類,必須使用完全限定名稱 new \C()。
原文轉自:http://blogread.cn/it/article/4378