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