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

黄舟
發布: 2023-03-06 13:14:01
原創
1337 人瀏覽過

在維基百科中,命名空間的定義是: 命名空間(英文:Namespace)表示識別碼( identifier)的上下文(context)

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


#命名空間可以看成是封裝事物的方法,同時也可以看作是組織代碼結構的一種形式,在許多語言中都可以看到這種抽象概念和組織形式。 在PHP中,命名空間用來解決在編寫類別庫或應用程式時創建可重複使用的程式碼如類別或函數時碰到的兩類問題:

1.使用者所寫的程式碼與PHP內部的類別/函數/常數或第三方類別/函數/常數之間的名字衝突。

2.為很長的識別碼名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高原始碼的可讀性。


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


#
<?php
namespace tipi;
class Exception {
    public static $var = &#39;think in php internal&#39;;
}
 
const E_ALL = "E_ALL IN Tipi";
 
function strlen(){
    echo &#39;strlen in tipi&#39;;
}
 
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核心-命名空間的技巧分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板