微信小程序模版廣州seo網(wǎng)站推廣公司
文章目錄
- 參考
- 環(huán)境
- 三種名稱
- 非限定名稱
- 限定名稱
- 完全限定名稱
- 舉個栗子
- use
- use 關(guān)鍵字
- use ... as ..
- 命名沖突
- 真假美猴王
- 兩個世界
參考
項目 | 描述 |
---|---|
搜索引擎 | Bing、Google |
AI 大模型 | 文心一言、通義千問、訊飛星火認(rèn)知大模型、ChatGPT |
PHP 官方 | PHP Manual |
PHP 官方 | language.namespaces.rationale.php |
環(huán)境
項目 | 描述 |
---|---|
PHP | 5.5.0 、5.6.8 、7.0.0 、7.2.5 、7.4.9 、8.0.0 、8.2.9 |
PHP 編輯器 | PhpStorm 2023.1.1(專業(yè)版) |
三種名稱
在 PHP 命名空間的上下文中,限定名稱 (Qualified Name)、非限定名稱 (Unqualified Name) 與完全限定名稱 (Fully Qualified Name) 是 三種引用命名空間中的元素(類、接口、函數(shù) 與 常量)的方式
。
非限定名稱
非限定名稱是一個 不包含任何命名空間前綴的名稱
,如 ClassName
就是一個非限定名稱。當(dāng)使用非限定名稱時,PHP 會 優(yōu)先在當(dāng)前命名空間中查找該元素
。若該原始不存在于當(dāng)前命名空間中,則將在全局命名空間中對其進(jìn)行查找(僅當(dāng)被查找元素為函數(shù)或常量時)
。
限定名稱
限定名稱包含 命名空間前綴,但沒有開頭的反斜線 \(該反斜線表示全局命名空間)
。如 NamespaceName\ClassName
與 NamespaceName\functionName()
就是限定名稱。當(dāng)使用限定名稱時,PHP 會 基于當(dāng)前命名空間來解析該名稱
。
完全限定名稱
完全限定名稱從反斜線 \(該反斜線表示全局命名空間)
開始,后接命名空間或元素的名稱。如 \Full\NamespaceName\ClassName
與 \Full\NamespaceName\functionName()
就是完全限定名稱。當(dāng)使用完全限定名稱時,PHP 會 完全忽略當(dāng)前命名空間的上下文,并從全局上下文解析名稱
。
舉個栗子
<?phpnamespace HOME\RedHeart {function saySelf() {# 通過魔術(shù)常量 __NAMESPACE 回當(dāng)前所屬的命名空間名稱return __NAMESPACE__;}function saySon() {# 嘗試訪問當(dāng)前命名空間中的子命名空間 BinaryMoon 中的 saySelf() 函數(shù)return BinaryMoon\saySelf();}
}namespace HOME\RedHeart\BinaryMoon {function saySelf() {return __NAMESPACE__;}
}# 全局命名空間
namespace {# 嘗試訪問 HOME\RedHeart\BinaryMoon 命名空間下的 saySelf() 函數(shù)var_dump(\HOME\RedHeart\BinaryMoon\saySelf());# 嘗試訪問 HOME\RedHeart 命名空間下的 saySelf() 函數(shù)var_dump(HOME\RedHeart\saySelf());# 嘗試訪問 HOME\RedHeart 命名空間下的 saySon() 函數(shù)var_dump(\HOME\RedHeart\saySon());
}
執(zhí)行效果
string(24) "HOME\RedHeart\BinaryMoon"
string(13) "HOME\RedHeart"
string(24) "HOME\RedHeart\BinaryMoon"
use
use 關(guān)鍵字
在 PHP 中,use
關(guān)鍵字用于導(dǎo)入命名空間中的 類
、接口
、函數(shù)
或 常量
,以便在當(dāng)前命名空間中直接使用這些元素的 非限定名稱
,有助于提高開發(fā)體驗😎。對此,請參考如下示例:
<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {# 將 \HOME\RedHeart\BinaryMoon\ 命名空間下的# MyClass 類導(dǎo)入至當(dāng)前命名空間,便可以使用非限定名稱訪問該類。use \HOME\RedHeart\BinaryMoon\MyClass;var_dump(new MyClass());# 將 \HOME\RedHeart\BinaryMoon\ 命名空間下的# 函數(shù) sayHello 與常量 CONSTANT 導(dǎo)入當(dāng)前命名空間use function HOME\RedHeart\BinaryMoon\sayHello;use const HOME\RedHeart\BinaryMoon\CONSTANT;sayHello();print(CONSTANT . "\n");
}
執(zhí)行效果
在 PHP 中,use
關(guān)鍵字的默認(rèn)操作對象是 類
。若您需要將 函數(shù)
或 常量
導(dǎo)入至當(dāng)前命名空間,請在 use
關(guān)鍵字后添加 function
或 const
以告知 PHP 解釋器。
object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon
use … as …
在 PHP 中,use ... as ...
語句用于導(dǎo)入命名空間中的 類
、接口
、函數(shù)
或 常量
并為它們創(chuàng)建一個 別名
,以便可以在當(dāng)前代碼塊中使用別名來引用相關(guān)的元素。對此,請參考如下示例:
<?phpnamespace HOME\RedHeart\BinaryMoon {const CONSTANT = __NAMESPACE__;class MyClass{public $name = 'RedHeart';public $nation = 'China';public $age = 18;}function sayHello() {print("Hello World\n");}
}namespace {use \HOME\RedHeart\BinaryMoon\MyClass as AnClass;use function HOME\RedHeart\BinaryMoon\sayHello as speakHello;use const HOME\RedHeart\BinaryMoon\CONSTANT as ANCONSTANT;var_dump(new AnClass());speakHello();print(ANCONSTANT . "\n");
}
執(zhí)行效果
object(HOME\RedHeart\BinaryMoon\MyClass)#1 (3) {["name"]=>string(8) "RedHeart"["nation"]=>string(5) "China"["age"]=>int(18)
}
Hello World
HOME\RedHeart\BinaryMoon
命名沖突
真假美猴王
<?phpnamespace BinaryMoon {class BinaryMoon {}
}
在上述示例中,命名空間 BinaryMoon
與其 類元素 BinaryMoon
使用相同名稱。按照正常情況,兩者將發(fā)生 命名沖突
,但上述示例卻能夠正常執(zhí)行。這是由于,命名空間 BinaryMoon
的完全限定名稱是 \BinaryMoon
,而 類元素 BinaryMoon
的完全限定名稱是 \BinaryMoon\BinaryMoon
,兩者的名稱 并不真的相同
。
兩個世界
實際上,命名空間與其他元素之間并不會產(chǎn)生命名沖突,即使兩者的完全限定名稱一模一樣
。對此,請參考如下示例:
<?phpnamespace BinaryMoon {}namespace {class BinaryMoon {}var_dump(new \BinaryMoon());
}
執(zhí)行效果
在使用 class 關(guān)鍵字創(chuàng)建類 BinaryMoon 后,類與命名空間具有相同的完全限定名稱 \BinaryMoon
,這并不會導(dǎo)致兩者發(fā)生 命名沖突
,PHP 會 依據(jù)具體情景進(jìn)行分析來確定如何解析該名稱
。但程序并非完美的,它無法應(yīng)對所有可能的場景,鑒于此,請 盡可能不要嘗試使用相同的名稱
。
object(BinaryMoon)#1 (0) {
}