(PHP 5 >= 5.3.0, PHP 7, PHP 8)
在說(shuō)明名稱(chēng)解析規則之前,我們先看一些重要的定義:
名稱(chēng)中不包含命名空間分隔符的標識符,例如 Foo
名稱(chēng)中含有命名空間分隔符的標識符,例如 Foo\Bar
名稱(chēng)中包含命名空間分隔符,并以命名空間分隔符開(kāi)始的標識符,例如 \Foo\Bar。
namespace\Foo 也是一個(gè)完全限定名稱(chēng)。
這是個(gè)以 namespace 開(kāi)頭的標識符,
例如
namespace\Foo\Bar。
名稱(chēng)解析遵循下列規則:
\A\B 解析為 A\B。
namespace。
如果名稱(chēng)出現在全局命名空間,會(huì )截掉 namespace\ 前綴。
例如,在命名空間 X\Y 里的 namespace\A 會(huì )被解析成 X\Y\A。
在全局命名空間里,同樣的名字卻被解析成 A。
A\B\C 被導入為 C,
名稱(chēng) C\D\E 會(huì )被翻譯成
A\B\C\D\E。
A\B 內的名稱(chēng) C\D\E
會(huì )解析成 A\B\C\D\E。
use A\B\C; 后,類(lèi)似 new C() 這樣的名稱(chēng)會(huì )解析為
A\B\C()。
類(lèi)似的,use function A\B\fn; 后,
fn() 的用法,解析名稱(chēng)為 A\B\fn。
A\B 內的 new C()
會(huì )把名稱(chēng)解析為 A\B\C。
A\B 中,
下面演示了調用函數
foo() 是如何解析的:
A\B\foo()。
foo()。
示例 #1 名稱(chēng)解析示例
<?php
namespace A;
use B\D, C\E as F;
// 函數調用
foo(); // 首先嘗試調用定義在命名空間"A"中的函數foo()
// 再?lài)L試調用全局函數 "foo"
\foo(); // 調用全局空間函數 "foo"
my\foo(); // 調用定義在命名空間"A\my"中函數 "foo"
F(); // 首先嘗試調用定義在命名空間"A"中的函數 "F"
// 再?lài)L試調用全局函數 "F"
// 類(lèi)引用
new B(); // 創(chuàng )建命名空間 "A" 中定義的類(lèi) "B" 的一個(gè)對象
// 如果未找到,則嘗試自動(dòng)裝載類(lèi) "A\B"
new D(); // 使用導入規則,創(chuàng )建命名空間 "B" 中定義的類(lèi) "D" 的一個(gè)對象
// 如果未找到,則嘗試自動(dòng)裝載類(lèi) "B\D"
new F(); // 使用導入規則,創(chuàng )建命名空間 "C" 中定義的類(lèi) "E" 的一個(gè)對象
// 如果未找到,則嘗試自動(dòng)裝載類(lèi) "C\E"
new \B(); // 創(chuàng )建定義在全局空間中的類(lèi) "B" 的一個(gè)對象
// 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "B"
new \D(); // 創(chuàng )建定義在全局空間中的類(lèi) "D" 的一個(gè)對象
// 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "D"
new \F(); // 創(chuàng )建定義在全局空間中的類(lèi) "F" 的一個(gè)對象
// 如果未發(fā)現,則嘗試自動(dòng)裝載類(lèi) "F"
// 調用另一個(gè)命名空間中的靜態(tài)方法或命名空間函數
B\foo(); // 調用命名空間 "A\B" 中函數 "foo"
B::foo(); // 調用命名空間 "A" 中定義的類(lèi) "B" 的 "foo" 方法
// 如果未找到類(lèi) "A\B" ,則嘗試自動(dòng)裝載類(lèi) "A\B"
D::foo(); // 使用導入規則,調用命名空間 "B" 中定義的類(lèi) "D" 的 "foo" 方法
// 如果類(lèi) "B\D" 未找到,則嘗試自動(dòng)裝載類(lèi) "B\D"
\B\foo(); // 調用命名空間 "B" 中的函數 "foo"
\B::foo(); // 調用全局空間中的類(lèi) "B" 的 "foo" 方法
// 如果類(lèi) "B" 未找到,則嘗試自動(dòng)裝載類(lèi) "B"
// 當前命名空間中的靜態(tài)方法或函數
A\B::foo(); // 調用命名空間 "A\A" 中定義的類(lèi) "B" 的 "foo" 方法
// 如果類(lèi) "A\A\B" 未找到,則嘗試自動(dòng)裝載類(lèi) "A\A\B"
\A\B::foo(); // 調用命名空間 "A\B" 中定義的類(lèi) "B" 的 "foo" 方法
// 如果類(lèi) "A\B" 未找到,則嘗試自動(dòng)裝載類(lèi) "A\B"
?>