在維基百科中,對命名空間的定義是: 命名空間(英語:Namespace)表示標識符(identifier)的上下文(context)。
一個標識符可在多個命名空間中定義, 它在不同命名空間中的含義是互不相干的。在程式設計語言中,命名空間是一種特殊的範圍,它包含了處於該範圍內的標識符, 且本身也用一個標識符來表示,這樣便將一系列在邏輯上相關的標識符用一個標識符組織了起來。 函數和類的範圍可被視作隱式命名空間,它們和可見度、可訪問性和對象生命週期不可分割的聯絡在一起。
命名空間可以看作是一種封裝事物的方法,同時也可以看作是組織代碼結構的一種形式,在很多語言中都可以見到這種抽象概念和組織形式。 在PHP中,命名空間用來解決在編寫類庫或應用程式時建立可重用的代碼如類或函數時碰到的兩類問題:
1.使用者編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字衝突。
2.為很長的標識符名稱(通常是為了緩解第一類問題而定義的)建立一個別名(或簡短)的名稱,提高原始碼的可讀性。
PHP從5.3.0版本開始支援命名空間特性。看一個定義和使用命名空間的樣本:
<?phpnamespace tipi;class Exception { public static $var = 'think in php internal';} const E_ALL = "E_ALL IN Tipi"; function strlen(){ echo 'strlen in tipi';} echo Exception::$var;echo strlen(Exception::$var);
1.樣本:
2.命名空間的定義
3.命名空間的使用
以函數調用為例,當需要調用函數時,會調用zend_do_begin_function_call函數。 在此函數中,當使用到命名空間時會檢查函數名,其調用的函數為zend_resolve_non_class_name。 在zend_resolve_non_class_name函數中會根據類型作出判斷並返回相關結果:
1.完全限定名稱的函數: 程式首先會做此判斷,其判斷的依據是第一個字元是否為"\",這種情況下,在解析時會直接返回。 如類似於\strlen這樣以\開頭的全域調用或類似於前面定義的\tipi\Exception調用。
2.所有的非限定名稱和限定名稱(非完全限定名稱):根據當前的匯入規則 程式判斷是否為別名,並從編譯期間儲存別名的HashTable中取出對應的命名空間名稱,將其與現有的函數名合并。 關於別名的儲存及產生在後面的內容中會說明,
3.在命名空間內部: 所有的沒有根據匯入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。最後判斷是否在當前命名空間, 最終程式都會返回一個合并了命名空間的函數名。
4.別名/匯入
允許通過別名引用或匯入外部的完全限定名稱,是命名空間的一個重要特徵。
這有點類似於在類 unix 檔案系統中可以建立對其它的檔案或目錄的符號串連。 PHP 命名空間支援 有兩種使用別名或匯入方式:為類名稱使用別名,或為命名空間名稱使用別名。