命名空間的順序

2021-07-22 14:16:39 字數 2387 閱讀 9272

自從有了命名空間之後,最容易出錯的該是使用類的時候,這個類的尋找路徑是什麼樣的了。

<?

phpnamespacea;

useb\d

,c\e asf

;// 函式呼叫

foo();

// 首先嘗試呼叫定義在命名空間"a"中的函式foo()

// 再嘗試呼叫全域性函式 "foo"

\foo

();// 呼叫全域性空間函式 "foo"

my\foo

();// 呼叫定義在命名空間"a\my"中函式 "foo"

f();

// 首先嘗試呼叫定義在命名空間"a"中的函式 "f"

// 再嘗試呼叫全域性函式 "f"

// 類引用

newb

();// 建立命名空間 "a" 中定義的類 "b" 的乙個物件

// 如果未找到,則嘗試自動裝載類 "a\b"

newd

();// 使用匯入規則,建立命名空間 "b" 中定義的類 "d" 的乙個物件

// 如果未找到,則嘗試自動裝載類 "b\d"

newf

();// 使用匯入規則,建立命名空間 "c" 中定義的類 "e" 的乙個物件

// 如果未找到,則嘗試自動裝載類 "c\e"

new\b

();// 建立定義在全域性空間中的類 "b" 的乙個物件

// 如果未發現,則嘗試自動裝載類 "b"

new\d

();// 建立定義在全域性空間中的類 "d" 的乙個物件

// 如果未發現,則嘗試自動裝載類 "d"

new\f

();// 建立定義在全域性空間中的類 "f" 的乙個物件

// 如果未發現,則嘗試自動裝載類 "f"

// 呼叫另乙個命名空間中的靜態方法或命名空間函式

b\foo

();// 呼叫命名空間 "a\b" 中函式 "foo"b::

foo();

// 呼叫命名空間 "a" 中定義的類 "b" 的 "foo" 方法

// 如果未找到類 "a\b" ,則嘗試自動裝載類 "a\b"d::

foo();

// 使用匯入規則,呼叫命名空間 "b" 中定義的類 "d" 的 "foo" 方法

// 如果類 "b\d" 未找到,則嘗試自動裝載類 "b\d"

\b\foo

();// 呼叫命名空間 "b" 中的函式 "foo"

\b::

foo();

// 呼叫全域性空間中的類 "b" 的 "foo" 方法

// 如果類 "b" 未找到,則嘗試自動裝載類 "b"

// 當前命名空間中的靜態方法或函式

a\b::

foo();

// 呼叫命名空間 "a\a" 中定義的類 "b" 的 "foo" 方法

// 如果類 "a\a\b" 未找到,則嘗試自動裝載類 "a\a\b"

\a\b

::foo

();// 呼叫命名空間 "a\b" 中定義的類 "b" 的 "foo" 方法

// 如果類 "a\b" 未找到,則嘗試自動裝載類 "a\b"

?>

名稱解析遵循下列規則:

對完全限定名稱的函式,類和常量的呼叫在編譯時解析。例如 new \a\b 解析為類 a\b。

所有的非限定名稱和限定名稱(非完全限定名稱)根據當前的匯入規則在編譯時進行轉換。例如,如果命名空間 a\b\c 被匯入為 c,那麼對 c\d\e() 的呼叫就會被轉換為 a\b\c\d\e()。

在命名空間內部,所有的沒有根據匯入規則轉換的限定名稱均會在其前面加上當前的命名空間名稱。例如,在命名空間 a\b 內部呼叫 c\d\e(),則 c\d\e() 會被轉換為 a\b\c\d\e() 。

非限定類名根據當前的匯入規則在編譯時轉換(用全名代替短的匯入名稱)。例如,如果命名空間 a\b\c 匯入為c,則 new c() 被轉換為 new a\b\c() 。

在命名空間內部(例如a\b),對非限定名稱的函式呼叫是在執行時解析的。例如對函式 foo() 的呼叫是這樣解析的:

在當前命名空間中查詢名為 a\b\foo() 的函式

嘗試查詢並呼叫 全域性(global) 空間中的函式 foo()。

在命名空間(例如a\b)內部對非限定名稱或限定名稱類(非完全限定名稱)的呼叫是在執行時解析的。下面是呼叫 new c() 及 new d\e() 的解析過程: new c()的解析:

在當前命名空間中查詢a\b\c類。

嘗試自動裝載類a\b\c。

new d\e()的解析:

在類名稱前面加上當前命名空間名稱變成:a\b\d\e,然後查詢該類。

嘗試自動裝載類 a\b\d\e。

為了引用全域性命名空間中的全域性類,必須使用完全限定名稱 new \c()。

類命名空間 物件的命名空間 查詢順序

類命名空間與物件的命名空間 類的命名空間 建立乙個類就會建立乙個類的命名空間,用來儲存類中定義的所有名字,這些名字稱為類的屬性 類有兩種屬性 靜態屬性和動態屬性 靜態屬性 直接在類中定義的變數 動態屬性 定義在類中的方法 其中類的資料屬性是共享給所有物件的 id egg.role 434159407...

命名空間的查詢順序

第一 重要的知識點 名字的查詢 1首先你要先確定你在現在處在那個空間 1,如果站在全域性 那你的查詢順序就是全域性到 內建 2,站在區域性 區域性 全域性 內建 x 111 def f1 x 222 def f2 x 333 def f3 x 444 def f4 x 555 print x f4 ...

小白收藏 Python命名空間查詢順序

當一行 要使用變數 x 的值時,python 會到所有可用的名字空間去查詢變數,按照如下順序 1 區域性命名空間 特指當前函式或類的方法。如果函式定義了乙個區域性變數 x,或乙個引數 x,python 將使用它,然後停止搜尋。2 全域性命名空間 特指當前的模組。如果模組定義了乙個名為 x 的變數,函...