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