溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何在PHP中使用命名空間

發(fā)布時間:2021-05-12 16:43:47 來源:億速云 閱讀:336 作者:Leah 欄目:開發(fā)技術(shù)

如何在PHP中使用命名空間?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

前言

命名空間(namespace),在編程語言中,是對作用域的一種特殊的抽象.它表示著一個標(biāo)識符的可見范圍。一個標(biāo)識符可在多個命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個新的命名空間中可定義任何標(biāo)識符,它們不會與任何已有的標(biāo)識符發(fā)生沖突,因為已有的定義都處于其他命名空間中。

在PHP中也存在命名空間的用法,由它控制可見范圍的這個標(biāo)識符一般指的就是類和函數(shù)。

一、PHP命名空間基礎(chǔ)

從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如PHP的類名是不可以重復(fù)的,但是經(jīng)常我們需要引入一些第三方的類庫,常常類名就會在項目中產(chǎn)生重復(fù)沖突,所以,命名空間就是解決這個沖突的一種方法。

在PHP5.3以后,就已經(jīng)引入了命名空間(namespace)的概念,即同個命名空間下的類名不能重復(fù),不同命名空間下可以存在同名的類。

這樣,在引入第三方類庫的時候,只有各個類庫的命名空間不一樣,就不會產(chǎn)生沖突。

所以根據(jù)官方所說,在PHP中,命名空間用來解決在編寫類庫或應(yīng)用程序時創(chuàng)建可重用的代碼如類或函數(shù)時碰到的兩類問題:

1、用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
2、為很長的標(biāo)識符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個別名(或簡短)的名稱,提高源代碼的可讀性。

需要注意的是:

  • 同個文件下可以存在多個命名空間;

  • 不同命名空間內(nèi)的類可以相互調(diào)用。

如何在PHP中使用命名空間

二、PHP命名空間的用法

1、定義

命名空間的定義采用關(guān)鍵字namespace,定義方式如下:

namespace example

則該命名空間下的類都歸屬于該命名空間,example命名空間下的類不能重名。

或者可以定義多級命名空間:

namespace example\test\demo

則改命名空間下的類全歸屬于example\test\demo命名空間。

定義后的命名空間可以用__NAMESPACE__魔法變量來獲取當(dāng)前命名空間。

2、引入

引入命名空間使用關(guān)鍵字use,可以通過多個use在一個文件中引入多個命名空間:

use example;
use example\test\demo;

需要使用到哪個命名空間的類和方法,則use哪個命名空間,前提是這些命名空間的實際文件地址已經(jīng)包含進來了,或者說能實現(xiàn)自動的類加載了。

3、實例化

在程序中實例化并使用某個命名空間下的類方法,同樣使用new關(guān)鍵字進行實例化,但是需要在類名前面加上命名空間前綴。

例如:

$class = new example\a();//實例化example命名空間下的a類
$class = new example\test\demo\b(); //實例化example\test\demo命名空間下的b類

如果在文件前面已經(jīng)引入了這些命名空間,則可以不需要類的前綴:

use example;
use example\test\demo;
$class = new a();//實例化example命名空間下的a類
$class = new b(); //實例化example\test\demo命名空間下的b類

注:如果use的時候是use example\test;則在實例化b類時要帶上相對命名空間路徑(注意不是實際文件路徑),即new demo\b();

當(dāng)然所有的實例化都可以直接使用絕對路徑形式,即在命名空間前面加\字符,如new \example\test\demo\b();這樣就采用了絕對路徑形式實例化了b類。

4、別名

在用namespace定義命名空間的時候,為了避免之后引用的時候命名空間過長,可以在定義時采用as關(guān)鍵字為一個命名空間指定別名

namespace example\test\demo as testDemo;

這樣在之后引用或?qū)嵗臅r候就可以new testDemo\<類名>();

三、基于PSR4的命名空間規(guī)范

由于方法、類在不同項目中命名空間定義不一致,第三方類庫的命名空間也定義不一致,所以相關(guān)php組織出臺了一套約定俗成的規(guī)范,即PSR4規(guī)范,

用來規(guī)范命名空間的定義規(guī)則。

具體規(guī)范如下:

1. 一個完整的類名需具有以下結(jié)構(gòu):

\<命名空間>(\<子命名空間>)*\<類名>
    1. 完整的類名 必須 要有一個頂級命名空間,被稱為 "vendor namespace";
    2. 完整的類名 可以 有一個或多個子命名空間;
    3. 完整的類名 必須 有一個最終的類名;
    4. 完整的類名中任意一部分中的下滑線都是沒有特殊含義的;
    5. 完整的類名 可以 由任意大小寫字母組成;
    6. 所有類名都 必須 是大小寫敏感的。

2. 當(dāng)根據(jù)完整的類名載入相應(yīng)的文件

    (1). 完整的類名中,去掉最前面的命名空間分隔符,前面連續(xù)的一個或多個命名空間和子命名空間,作為「命名空間前綴」,其必須與至少一個「文件基目錄」相對應(yīng);
    (2). 緊接命名空間前綴后的子命名空間 必須 與相應(yīng)的「文件基目錄」相匹配,其中的命名空間分隔符將作為目錄分隔符。
    (3). 末尾的類名 必須 與對應(yīng)的以 .php 為后綴的文件同名。
    (4). 自動加載器(autoloader)的實現(xiàn) 一定不可 拋出異常、一定不可 觸發(fā)任一級別的錯誤信息以及 不應(yīng)該 有返回值。

看起來很復(fù)雜,其實規(guī)范的要點就是,命名空間的路徑要與當(dāng)前文件的路徑相對應(yīng),這樣規(guī)范了所有項目命名空間的定義準則,雖然PHP官方?jīng)]有

強制規(guī)定,但如今許多開源項目都已經(jīng)約定俗成地使用了,這種規(guī)范便于查找命名空間下的類所在的路徑。

例如,文件目錄a/b/c下有d.php,則在a目錄下的的文件引入d的類時,應(yīng)該是use b/c或use /a/b/c;(絕對路徑形式)

四、注意點

1、代碼復(fù)用類Trait也符合命名空間的規(guī)范,即通過命名空間下Trait類不能重名;
2、雖然PSR4規(guī)定了命名空間路徑與文件路徑需要相對應(yīng),但是運行php時命名空間路徑與文件路徑是沒有任何關(guān)系的,例如a/b/c下的文件類d,命名空間可以寫成a1/b1/c1/d;只不過現(xiàn)在的許多開源框架在實現(xiàn)類自動加載的時候把兩者規(guī)范為一致,否則會出現(xiàn)類文件加載到了,但是命名空間卻加載不到的情況。
3、在命名空間內(nèi)部,所有的沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱均會在其前面加上當(dāng)前的命名空間名稱。例如,在命名空間A\B內(nèi)部調(diào)用C\D\e(),則C\D\e()會被轉(zhuǎn)換為A\B\C\D\e()。
4、在命名空間內(nèi)部(例如A\B),對非限定名稱的函數(shù)調(diào)用是在運行時解析的。例如對函數(shù)foo()的調(diào)用是這樣解析的:
(1)在當(dāng)前命名空間中查找名為A\B\foo()的函數(shù)
(2)嘗試查找并調(diào)用全局(global)空間中的函數(shù)foo()。
5、在命名空間(例如A\B)內(nèi)部對非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運行時解析的。下面是調(diào)用new C()及new D\E()的解析過程:new C()的解析:
(1)在當(dāng)前命名空間中查找A\B\C類。
(2)嘗試自動裝載類A\B\C。

php是什么語言

php,一個嵌套的縮寫名稱,是英文超級文本預(yù)處理語言(PHP:Hypertext Preprocessor)的縮寫。PHP 是一種 HTML 內(nèi)嵌式的語言,PHP與微軟的ASP頗有幾分相似,都是一種在服務(wù)器端執(zhí)行的嵌入HTML文檔的腳本語言,語言的風(fēng)格有類似于C語言,現(xiàn)在被很多的網(wǎng)站編程人員廣泛的運用。

看完上述內(nèi)容,你們掌握如何在PHP中使用命名空間的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI