對名空間命的解釋:
命名空間使用的關(guān)鍵字是namespace其主要目的就是為了代碼復(fù)用,那么代碼復(fù)用為什么會要用到命名空間呢?原因是因?yàn)轭?函數(shù),常量都是全局有效,包括在函數(shù)中也可以直接使用,因此,在全局中不允許有重名的類,函數(shù)和常量。如果想從外部導(dǎo)入一個函數(shù)庫或類庫,他們的函數(shù)名,類名極有可能與當(dāng)前腳本沖突,所以,必須要有一套對于工作在全局范圍內(nèi)的腳本成員,進(jìn)行標(biāo)識符命名沖突處理的機(jī)制。命名空間就是這樣一套解決方案,他不僅可以讓用戶為全局成員起一個較短的名稱,又解決了第三方資源的引入帶來的重名問題。
案例一:最基礎(chǔ)的命名空間的使用案例,用大括號語法實(shí)現(xiàn)在一個腳本中創(chuàng)建多個命名空間并訪問成員:
<?php //命名空間 // 用大括號語法實(shí)現(xiàn)在一個腳本中創(chuàng)建多個命名空間并訪問成員 namespace One { class A { const SITE = "PHP后臺管理"; public $name = "php"; public function show() { return "空間One的方法:"; } } } namespace Two { class A { const SITE = "JavaScripe"; public $name = "中文網(wǎng)"; public function hello() { return "空間Two的方法:"; } } //在Two空間下調(diào)用本空間內(nèi)的常量 echo A::SITE.'<br>'; //在Two空間下調(diào)用One空間內(nèi)的屬性 echo (new \One\A())->name.'<br>'; //在Two空間下調(diào)用One空間內(nèi)的常量 echo \One\A::SITE.'<br>'; //輸出One空間下的函數(shù) echo (new \One\A())->show().'<br>'; //輸出當(dāng)前空間的名字 echo '當(dāng)前命名空間是: '.__NAMESPACE__.'<br>'; } namespace { //在全局空間下調(diào)用One空間內(nèi)的常量 echo (new \One\A())->name.'<br>'; } ?>
說明:命名空間的關(guān)鍵字是namespace,namespace之前不能有除了declare和注釋之外的任何代碼,html也不行,如果當(dāng)前腳本聲明了命名空間,則所有成員的訪問,就必須使用命名空間,包括系統(tǒng)函數(shù);在不同空間內(nèi)調(diào)用其他空間的類中的函數(shù)或方法需要加上對應(yīng)空間的路徑,值得注意的是,在沒有使用任何命名空間的情部下,所有類,常量,函數(shù)全部聲明在全局空間,用\表示,如果沒有明確定義某個空間,那么就是默認(rèn)在全局空間下,另外在聲明類,常量,函數(shù)的時候,前面不需要添加\,調(diào)用的時候才需要添加\;還有一點(diǎn)是,在全局不允許重復(fù)聲明類,常量與函數(shù)。
案例二:使用use 導(dǎo)入其它腳本中的類/常量/函數(shù),并使用別名方式訪問:
<?php namespace One { class A { const SITE = "PHP后臺管理"; public $name = "php"; public function show() { return "空間One的方法:"; } } } namespace Two { class A { const SITE = "JavaScripe"; public $name = "中文網(wǎng)"; public function hello() { return "空間Two的方法:"; } } }
<?php //使用use 導(dǎo)入其它腳本中的類/常量/函數(shù),并使用別名方式訪問 namespace Three { include 'demo2.php'; //通過use使用空間One use \One\A as A1 ; class A { public function show() { return '空間C的方法'; } } //在空間Three中使用空間One中的常量 echo A1::SITE.'<br>'; //在空間Three中使用空間One中的方法 echo (new A1())->show().'<br>'; //在空間Three中使用空間One中的屬性 echo (new A1())->name.'<br>'; } ?>
說明:use關(guān)鍵字導(dǎo)入一個命名空間,結(jié)合include,require等把相應(yīng)文件包涵進(jìn)來可以達(dá)到跨文件調(diào)用不同命名空間中類的目的,同時使用關(guān)鍵字as 可以使調(diào)用不同空間中的類中函數(shù)或方法時使代碼更加的簡潔直觀。
問答:非限定名稱,限定名稱和完全限定名稱的命名空間之間的區(qū)別與聯(lián)系是什么?
答:我的理解是可以把它和文件訪問的思路去考慮,非限定名稱就是在當(dāng)前自己的命名空間下訪問自己類的函數(shù)或方法,不需要加上命名空間的前綴,而限定名稱就是在A命名空間中訪問B空間下類的函數(shù)或方法,此時就需要先表明你要在哪個空間下找,要不然系統(tǒng)是找不到的,而完全限定名稱其實(shí)包含了他們?nèi)魏蔚氖褂们闆r,就是直接在前邊加上絕對路徑,其實(shí)他是包涵非限定和限定的,但是有時候是不需要完全限定名稱的,要在合理的情況下使用各種方式,才不會有畫蛇添足的情況出現(xiàn)
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號