摘要:命名空間可以解決以下兩類問題用戶編寫的代碼與內(nèi)部的類函數(shù)常量或第三方類函數(shù)常量之間的名字沖突。在命名空間內(nèi)部訪問全局類函數(shù)和常量調(diào)用全局函數(shù)訪問全局常量實(shí)例化全局類命名空間和動(dòng)態(tài)語(yǔ)言特征命名空間的實(shí)現(xiàn)受到其語(yǔ)言自身的動(dòng)態(tài)特征的影響。
PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學(xué)過C#和Java,那命名空間就不算什么新事物。 不過在PHP當(dāng)中還是有著相當(dāng)重要的意義。
PHP 命名空間可以解決以下兩類問題:
用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
為很長(zhǎng)的標(biāo)識(shí)符名稱(通常是為了緩解第一類問題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱,提高源代碼的可讀性。
默認(rèn)情況下,所有常量、類和函數(shù)名都放在全局空間下,就和PHP支持命名空間之前一樣。
命名空間通過關(guān)鍵字namespace 來聲明。如果一個(gè)文件中包含命名空間,它必須在其它所有代碼之前聲明命名空間。語(yǔ)法格式如下;
< ?php // 定義代碼在 "MyProject" 命名空間中 namespace MyProject; // ... 代碼 ... ?>
你也可以在同一個(gè)文件中定義不同的命名空間代碼,如:
< ?php namespace MyProject1; // MyProject1 命名空間中的PHP代碼 namespace MyProject2; // MyProject2 命名空間中的PHP代碼 // 另一種語(yǔ)法 namespace MyProject3 { // MyProject3 命名空間中的PHP代碼 } ?>
在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語(yǔ)句。所有非 PHP 代碼包括空白符都不能出現(xiàn)在命名空間的聲明之前。
以下代碼會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤:
” 會(huì)致命錯(cuò)誤 - 命名空間必須是程序腳本的第一條語(yǔ)句 ?>子命名空間
與目錄和文件的關(guān)系很象,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層次的方式定義:
上面的例子創(chuàng)建了常量 MyProjectSubLevelCONNECT_OK,類 MyProjectSubLevelConnection 和函數(shù) MyProjectSubLevelConnect。
命名空間使用PHP 命名空間中的類名可以通過三種方式引用:
非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod();。如果當(dāng)前命名空間是 currentnamespace,foo 將被解析為 currentnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,則 foo 會(huì)被解析為foo。 警告:如果命名空間中的函數(shù)或常量未定義,則該非限定的函數(shù)名稱或常量名稱會(huì)被解析為全局函數(shù)名稱或常量名稱。
限定名稱,或包含前綴的名稱,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果當(dāng)前的命名空間是 currentnamespace,則 foo 會(huì)被解析為 currentnamespacesubnamespacefoo。如果使用 foo 的代碼是全局的,不包含在任何命名空間中的代碼,foo 會(huì)被解析為subnamespacefoo。
完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在這種情況下,foo 總是被解析為代碼中的文字名(literal name)currentnamespacefoo。
下面是一個(gè)使用這三種方式的實(shí)例:
file1.php 文件代碼
file2.php 文件代碼
注意訪問任意全局類、函數(shù)或常量,都可以使用完全限定名稱,例如 strlen() 或 Exception 或 INI_ALL。
在命名空間內(nèi)部訪問全局類、函數(shù)和常量:
命名空間和動(dòng)態(tài)語(yǔ)言特征PHP 命名空間的實(shí)現(xiàn)受到其語(yǔ)言自身的動(dòng)態(tài)特征的影響。因此,如果要將下面的代碼轉(zhuǎn)換到命名空間中,動(dòng)態(tài)訪問元素。
example1.php 文件代碼:
必須使用完全限定名稱(包括命名空間前綴的類名稱)。注意因?yàn)樵趧?dòng)態(tài)的類名稱、函數(shù)名稱或常量名稱中,限定名稱和完全限定名稱沒有區(qū)別,因此其前導(dǎo)的反斜杠是不必要的。
動(dòng)態(tài)訪問命名空間的元素
namespace關(guān)鍵字和__NAMESPACE__常量PHP支持兩種抽象的訪問當(dāng)前命名空間內(nèi)部元素的方法,__NAMESPACE__ 魔術(shù)常量和namespace關(guān)鍵字。
常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個(gè)空的字符串。
NAMESPACE 示例, 在命名空間中的代碼
NAMESPACE 示例,全局代碼
常量 NAMESPACE 在動(dòng)態(tài)創(chuàng)建名稱時(shí)很有用,例如:
使用__NAMESPACE__動(dòng)態(tài)創(chuàng)建名稱
關(guān)鍵字 namespace 可用來顯式訪問當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。
amespace操作符,命名空間中的代碼
namespace操作符, 全局代碼
使用命名空間:別名/導(dǎo)入PHP 命名空間支持 有兩種使用別名或?qū)敕绞剑簽轭惷Q使用別名,或?yàn)槊臻g名稱使用別名。注意PHP不支持導(dǎo)入函數(shù)或常量。
在PHP中,別名是通過操作符 use 來實(shí)現(xiàn)的. 下面是一個(gè)使用所有可能的三種導(dǎo)入方式的例子:
1、使用use操作符導(dǎo)入/使用別名
2、 一行中包含多個(gè)use語(yǔ)句
導(dǎo)入操作是在編譯執(zhí)行的,但動(dòng)態(tài)的類名稱、函數(shù)名稱或常量名稱則不是。
3、導(dǎo)入和動(dòng)態(tài)名稱
另外,導(dǎo)入操作只影響非限定名稱和限定名稱。完全限定名稱由于是確定的,故不受導(dǎo)入的影響。
4、導(dǎo)入和完全限定名稱
在一個(gè)命名空間中,當(dāng) PHP 遇到一個(gè)非限定的類、函數(shù)或常量名稱時(shí),它使用不同的優(yōu)先策略來解析該名稱。類名稱總是解析到當(dāng)前命名空間中的名稱。因此在訪問系統(tǒng)內(nèi)部或不包含在命名空間中的類名稱時(shí),必須使用完全限定名稱,例如:
1、在命名空間中訪問全局類
對(duì)于函數(shù)和常量來說,如果當(dāng)前命名空間中不存在該函數(shù)或常量,PHP 會(huì)退而使用全局空間中的函數(shù)或常量。
2、 命名空間中后備的全局函數(shù)/常量
全局空間如果沒有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此。
使用全局空間說明
命名空間的順序自從有了命名空間之后,最容易出錯(cuò)的該是使用類的時(shí)候,這個(gè)類的尋找路徑是什么樣的了。
名稱解析遵循下列規(guī)則對(duì)完全限定名稱的函數(shù),類和常量的調(diào)用在編譯時(shí)解析。例如 new AB 解析為類 AB。
所有的非限定名稱和限定名稱(非完全限定名稱)根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)進(jìn)行轉(zhuǎn)換。例如,如果命名空間 ABC 被導(dǎo)入為 C,那么對(duì) CDe() 的調(diào)用就會(huì)被轉(zhuǎn)換為 ABCDe()。
在命名空間內(nèi)部,所有的沒有根據(jù)導(dǎo)入規(guī)則轉(zhuǎn)換的限定名稱均會(huì)在其前面加上當(dāng)前的命名空間名稱。例如,在命名空間 AB 內(nèi)部調(diào)用CDe(),則 CDe() 會(huì)被轉(zhuǎn)換為 ABCDe() 。
非限定類名根據(jù)當(dāng)前的導(dǎo)入規(guī)則在編譯時(shí)轉(zhuǎn)換(用全名代替短的導(dǎo)入名稱)。例如,如果命名空間 ABC 導(dǎo)入為C,則 new C() 被轉(zhuǎn)換為 new ABC() 。
在命名空間內(nèi)部(例如AB),對(duì)非限定名稱的函數(shù)調(diào)用是在運(yùn)行時(shí)解析的。例如對(duì)函數(shù) foo() 的調(diào)用是這樣解析的:
在當(dāng)前命名空間中查找名為 ABfoo() 的函數(shù)
嘗試查找并調(diào)用 全局(global) 空間中的函數(shù) foo()。
在命名空間(例如AB)內(nèi)部對(duì)非限定名稱或限定名稱類(非完全限定名稱)的調(diào)用是在運(yùn)行時(shí)解析的。下面是調(diào)用 new C() 及 new DE() 的解析過程: new C()的解析:
在當(dāng)前命名空間中查找ABC類。
嘗試自動(dòng)裝載類ABC。
new DE()的解析:
在類名稱前面加上當(dāng)前命名空間名稱變成:ABDE,然后查找該類。
嘗試自動(dòng)裝載類 ABDE。
為了引用全局命名空間中的全局類,必須使用完全限定名稱 new C()。
http://www.manongjc.com/php/p...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22944.html
摘要:的使命是實(shí)現(xiàn)框架之間的互操作性。個(gè)人和官方都認(rèn)為開發(fā)者應(yīng)該遵循更為嚴(yán)格的代碼標(biāo)準(zhǔn),在現(xiàn)代的生態(tài)系統(tǒng)中,風(fēng)格統(tǒng)一,可以更好的讓其他開發(fā)者理解代碼。記錄的消息用于診斷檢查和排除應(yīng)用中的操作穩(wěn)定性和性能方面的問題。 原文是在我自己博客中,小伙伴也可以點(diǎn)閱讀原文進(jìn)行跳轉(zhuǎn)查看,還有好聽的背景音樂噢~ ????PSR是PHP Standards Recommendation的簡(jiǎn)稱,意為PHP推薦標(biāo)...
摘要:任務(wù)是加載類的初始化頂級(jí)命名空間與文件路徑映射初始化和注冊(cè)。在實(shí)際情況下可能會(huì)出現(xiàn)這樣的情況。值得注意的是這個(gè)函數(shù)返回的是一個(gè)匿名函數(shù),為什么呢原因就是類中的等等都是的。。。關(guān)于匿名函數(shù)的綁定功能。 前言 在開始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn 上一篇文章,我們討論了 PHP 的自動(dòng)加載原理、PHP 的命名空間、PHP 的 PSR0 與 PSR4 標(biāo)準(zhǔn),有...
前言 在開始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn上一篇 文章我們講到了 Composer 自動(dòng)加載功能的啟動(dòng)與初始化,經(jīng)過啟動(dòng)與初始化,自動(dòng)加載核心類對(duì)象已經(jīng)獲得了頂級(jí)命名空間與相應(yīng)目錄的映射,換句話說,如果有命名空間 AppConsoleKernel,我們已經(jīng)知道了 App 對(duì)應(yīng)的目錄,接下來我們就要解決下面的就是 ConsoleKernel這一段。 注冊(cè) 我們先回顧...
摘要:面試專欄正式起更,每周一三五更新,提供最好最優(yōu)質(zhì)的面試內(nèi)容。繼上一篇面試??純?nèi)容之面向?qū)ο蟀l(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?。面向?qū)ο蟮闹饕卣鳛榉庋b繼承多態(tài)。為了提高內(nèi)聚性減少引起變化,單一原則是低耦合高內(nèi)聚的面向原則上的引申。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。繼上一篇PHP面試??純?nèi)容之面向?qū)ο螅?)發(fā)表后,今天更新面向?qū)ο蟮淖詈笠黄?...
摘要:個(gè)人網(wǎng)站最近剛寫了一個(gè)手機(jī)在線播放的電影站使用日常手記更新使用的的查詢作用域的本地作用域去自定義可復(fù)用的約束集合,方便鏈?zhǔn)秸{(diào)用什么是本地查詢作用域本地作用域允許我們定義通用的約束集合以便在應(yīng)用中復(fù)用。 關(guān)于作者 程序開發(fā)人員,不拘泥于語(yǔ)言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是最完美的追求。 個(gè)人網(wǎng)站:...
閱讀 1156·2021-11-24 09:38
閱讀 3603·2021-11-22 15:32
閱讀 3457·2019-08-30 15:54
閱讀 2567·2019-08-30 15:53
閱讀 1494·2019-08-30 15:52
閱讀 2495·2019-08-30 13:15
閱讀 1837·2019-08-29 12:21
閱讀 1395·2019-08-26 18:36