欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP進(jìn)階學(xué)習(xí)之命名空間基本用法分析

 更新時(shí)間:2019年06月18日 10:43:41   作者:George-Henry  
這篇文章主要介紹了PHP進(jìn)階學(xué)習(xí)之命名空間基本用法,簡(jiǎn)單分析了php命名空間的基本概念、功能并結(jié)合實(shí)例形式描述了命名空間的用法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了PHP進(jìn)階學(xué)習(xí)之命名空間基本用法。分享給大家供大家參考,具體如下:

前言

命名空間(namespace),在編程語(yǔ)言中,是對(duì)作用域的一種特殊的抽象.它表示著一個(gè)標(biāo)識(shí)符的可見(jiàn)范圍。一個(gè)標(biāo)識(shí)符可在多個(gè)命名空間中定義,它在不同命名空間中的含義是互不相干的。這樣,在一個(gè)新的命名空間中可定義任何標(biāo)識(shí)符,它們不會(huì)與任何已有的標(biāo)識(shí)符發(fā)生沖突,因?yàn)橐延械亩x都處于其他命名空間中。

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

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

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

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

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

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

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

需要注意的是:

  • 同個(gè)文件下可以存在多個(gè)命名空間;
  • 不同命名空間內(nèi)的類可以相互調(diào)用。

二、PHP命名空間的用法

1、定義

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

namespace example

則該命名空間下的類都?xì)w屬于該命名空間,example命名空間下的類不能重名。

或者可以定義多級(jí)命名空間:

namespace example\test\demo

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

定義后的命名空間可以用_​_​NAMESPACE_​_​魔法變量來(lái)獲取當(dāng)前命名空間。

2、引入

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

use example;
use example\test\demo;

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

3、實(shí)例化

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

例如:

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

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

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

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

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

4、別名

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

namespace example\test\demo as testDemo;

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

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

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

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

具體規(guī)范如下:

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

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

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

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

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

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

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

四、注意點(diǎn)

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

以上內(nèi)容引用了PSR4文檔地址:http://www.php-fig.org/psr/psr-4/

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • WordPress中用于創(chuàng)建以及獲取側(cè)邊欄的PHP函數(shù)講解

    WordPress中用于創(chuàng)建以及獲取側(cè)邊欄的PHP函數(shù)講解

    這篇文章主要介紹了WordPress中用于創(chuàng)建以及獲取側(cè)邊欄的PHP函數(shù)講解,分別為register_sidebar()函數(shù)和get_sidebar()的使用,需要的朋友可以參考下
    2015-12-12
  • PHP實(shí)現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法示例

    PHP實(shí)現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)Unicode編碼相互轉(zhuǎn)換的方法,結(jié)合實(shí)例形式分析了Unicode編碼與解碼的相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-04-04
  • PHP內(nèi)核探索:變量概述

    PHP內(nèi)核探索:變量概述

    這篇文章主要介紹了PHP 變量的相關(guān)資料,需要的朋友可以參考下
    2014-01-01
  • 通過(guò)實(shí)例解析PHP數(shù)據(jù)類型轉(zhuǎn)換方法

    通過(guò)實(shí)例解析PHP數(shù)據(jù)類型轉(zhuǎn)換方法

    這篇文章主要介紹了通過(guò)實(shí)例解析PHP數(shù)據(jù)類型轉(zhuǎn)換方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • php解決DOM亂碼的方法示例代碼

    php解決DOM亂碼的方法示例代碼

    最近在工作的時(shí)候遇到一個(gè)問(wèn)題,在使用DOM的時(shí)候,發(fā)現(xiàn)了亂碼的問(wèn)題,后來(lái)通過(guò)查找網(wǎng)上的資料終于解決了,現(xiàn)在將解決的方法分享給大家,感興趣的朋友們可以參考借鑒,有需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • thinkphp在低版本Nginx 下支持PATHINFO的方法分享

    thinkphp在低版本Nginx 下支持PATHINFO的方法分享

    本文給大家分享的是如何讓thinkPHP在低版本的Nginx下支持PATHINFO去掉index.php路徑的方法,十分的簡(jiǎn)單實(shí)用,思路也很巧妙,有需要的小伙伴可以參考下
    2016-05-05
  • php獲取是星期幾的的一些常用姿勢(shì)

    php獲取是星期幾的的一些常用姿勢(shì)

    這篇文章主要給大家總結(jié)介紹了利用php獲取是星期幾的一些姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用php具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • PHP5常用函數(shù)列表(分享)

    PHP5常用函數(shù)列表(分享)

    本篇文章是對(duì)PHP5常用函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP7擴(kuò)展開發(fā)之hello word實(shí)現(xiàn)方法詳解

    PHP7擴(kuò)展開發(fā)之hello word實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了PHP7擴(kuò)展開發(fā)之hello word實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了php7擴(kuò)展開發(fā)的具體步驟與相關(guān)操作技巧,涉及針對(duì)php底層源碼的修改與編譯,需要的朋友可以參考下
    2018-01-01
  • PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù)示例

    PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù)示例

    這篇文章主要介紹了PHP基于GD庫(kù)實(shí)現(xiàn)的生成圖片縮略圖函數(shù),涉及php針對(duì)圖片屬性相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07

最新評(píng)論