PHP核心-命名空間的技巧分享

來源:互聯網
上載者:User

在維基百科中,對命名空間的定義是: 命名空間(英語: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 命名空間支援 有兩種使用別名或匯入方式:為類名稱使用別名,或為命名空間名稱使用別名。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.