PHP核心 命名空間

2021-07-23 23:21:12 字數 1714 閱讀 2829

在維基百科中,對命名空間的定義是:

命名空間(英語:namespace)表示識別符號(identifier)的上下文(context)。

乙個識別符號可在多個命名空間中定義, 它在不同命名空間中的含義是互不相干的。在程式語言中,命名空間是一種特殊的作用域,它包含了處於該作用域內的識別符號, 且本身也用乙個識別符號來表示,這樣便將一系列在邏輯上相關的識別符號用乙個識別符號組織了起來。 函式和類的作用域可被視作隱式命名空間,它們和可見性、可訪問性和物件生命週期不可分割的聯絡在一起。

命名空間可以看作是一種封裝事物的方法,同時也可以看作是組織**結構的一種形式,在很多語言中都可以見到這種抽象概念和組織形式。 在php中,命名空間用來解決在編寫類庫或應用程式時建立可重用的**如類或函式時碰到的兩類問題:

1.使用者編寫的**與php內部的類/函式/常量或第三方類/函式/常量之間的名字衝突。

2.為很長的識別符號名稱(通常是為了緩解第一類問題而定義的)建立乙個別名(或簡短)的名稱,提高源**的可讀性。

php從5.3.0版本開始支援命名空間特性。看乙個定義和使用命名空間的示例:

<?php 

namespace tipi;

class exception

const e_all = "e_all in tipi";

function strlen()

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 命名空間支援 有兩種使用別名或匯入方式:為類名稱使用別名,或為命名空間名稱使用別名。

PHP 核心特性之命名空間

提出 在命名空間提出之前,不同的元件很容易碰到命名的衝突,例如 request response 等常見的命名。php 在 5.3 後提出了命名空間用來解決元件之間的命名衝突問題,主要參考了檔案系統的設計 同乙個目錄下不允許有相同的檔名 同乙個命名空間下不允許有相同的類 不同的目錄可以有同名檔案 不...

php 命名空間,PHP使用命名空間

介紹 命名空間中的類,函式或常量可以通過以下方式使用 在當前命名空間中使用類 指定相對於當前命名空間的命名空間 提供命名空間的全限定名稱 從當前命名空間 在此示例中,從test1.php載入了命名空間。沒有命名空間引用的函式或類名稱將訪問當前命名空間中的功能或類名稱 示例 test1.php nam...

php命名空間

namespace misszhou function var dump a 1 var dump var dump 1 表示呼叫全域性 解決常量的衝突問題 有點像子目錄的概念 namespace meizi 必須放第一行 include func.inc.php function one func...