摘要:命名空間的支持版本,。另外,在目錄外訪問文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到。定義命名空間命名空間通過關鍵字來聲明。常量常量的值是包含當前命名空間名稱的字符串。
*命名空間的支持版本:PHP 5 > 5.3.0,PHP 7 。
什么是命名空間從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。
在PHP中,命名空間用來解決在編寫類庫或應用程序時創建可重用的代碼如類或函數時碰到的兩類問題:
用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突。
為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關的類、函數和常量組合到一起的途徑。
命名空間通過關鍵字namespace 來聲明。聲明命名空間的語句必須是文件的第一行語句,除了一個以外:declare關鍵字。在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語句。另外,所有非 PHP 代碼包括空白符都不能出現在命名空間的聲明之前。同一個命名空間可以定義在多個文件中,即允許將同一個命名空間的內容分割存放在不同的文件中。
namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
同目錄具有層次結構類似,命名空間也支持指定層次化的命名空間名稱。
上面的例子創建了常量MyProjectSubLevelCONNECT_OK,類 MyProjectSubLevelConnection和函數 MyProjectSubLevelconnect。
PHP還支持在同一個文件中定義不同的命名空間,但是非常不建議這種用法,這里就不多說了。
這里我有一個疑問,上面說命名空間定義必須是文件的第一行代碼,那在一個文件中定義多個命名空間不就是會出現不在第一行的情況?
針對這個問題試驗了一下,對于一個文件中包含多個命名空間的,必須所有的代碼都在某一個命名空間中,否則就會報 Fatal error: No code may exist outside of namespace {} in 的錯誤,對于全局代碼,那就放在全局的命名空間中,類似這樣 namespace { }
使用命名空間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。
NAMESPACE常量
常量__NAMESPACE__的值是包含當前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個空的字符串。
namespace 關鍵字
關鍵字 namespace 可用來顯式訪問當前命名空間或子命名空間中的元素。它等價于類中的 self 操作符。
使用命名空間所有支持命名空間的PHP版本支持三種別名或導入方式:為類名稱使用別名、為接口使用別名或為命名空間名稱使用別名。PHP 5.6開始允許導入函數或常量或者為它們設置別名。在PHP中,別名是通過操作符 use 來實現的.
namespace foo; use MyFullClassname as Another; // 下面的例子與 use MyFullNSname as NSname 相同 use MyFullNSname; // 導入一個全局類 use ArrayObject; // importing a function (PHP 5.6+) use function MyFullfunctionName; // aliasing a function (PHP 5.6+) use function MyFullfunctionName as func; // importing a constant (PHP 5.6+) use const MyFullCONSTANT; $obj = new namespaceAnother; // 實例化 fooAnother 對象 $obj = new Another; // 實例化 MyFullClassname 對象 NSnamesubnsfunc(); // 調用函數 MyFullNSnamesubnsfunc $a = new ArrayObject(array(1)); // 實例化 ArrayObject 對象 // 如果不使用 "use ArrayObject" ,則實例化一個 fooArrayObject 對象 func(); // calls function MyFullfunctionName echo CONSTANT; // echoes the value of MyFullCONSTANT ?>``` 注意對命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 FooBar以及相對的不包含命名空間分隔符的全局名稱如 FooBar)來說,前導的反斜杠是不必要的也不推薦的,因為導入的名稱必須是完全限定的,不會根據當前的命名空間作相對解析。為了簡化操作,PHP還支持在一行中使用多個use語句。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23246.html
摘要:命名空間可以解決以下兩類問題用戶編寫的代碼與內部的類函數常量或第三方類函數常量之間的名字沖突。在命名空間內部訪問全局類函數和常量調用全局函數訪問全局常量實例化全局類命名空間和動態語言特征命名空間的實現受到其語言自身的動態特征的影響。 PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什么新事物。 不過在PHP當中還是有著相當重要...
摘要:前言在開始之前,歡迎關注我自己的博客這篇文章是對自動加載功能的一個總結,內容涉及的自動加載功能的命名空間的與標準等內容。要實現第一步,第二步的功能,必須在開發時約定類名與磁盤文件的映射方法,只有這樣我們才能根據類名找到它對應的磁盤文件。 前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn 這篇文章是對PHP自動加載功能的一個總結,內容涉及PHP的自動加載功能、P...
摘要:但實際上在命名空間這里卻不一樣,不同類文件中的命名空間之間是相互分離的,即某個文件中定義的的命名空間,在其他的類文件中不能使用。解決在中添加依賴類庫的命名空間別名以上就是今天遇到的關于命名空間的一個坑,謹記于此。 (沒想好title,見諒) 導讀 PHP的類文件在被其他文件include的時候不能直接使用其他文件中的已定義的別名。比如有三個文件。 test.php 一個簡單的腳...
摘要:任務是加載類的初始化頂級命名空間與文件路徑映射初始化和注冊。在實際情況下可能會出現這樣的情況。值得注意的是這個函數返回的是一個匿名函數,為什么呢原因就是類中的等等都是的。。。關于匿名函數的綁定功能。 前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn 上一篇文章,我們討論了 PHP 的自動加載原理、PHP 的命名空間、PHP 的 PSR0 與 PSR4 標準,有...
閱讀 1818·2023-04-26 02:51
閱讀 2849·2021-09-10 10:50
閱讀 3025·2021-09-01 10:48
閱讀 3591·2019-08-30 15:53
閱讀 1815·2019-08-29 18:40
閱讀 404·2019-08-29 16:16
閱讀 2023·2019-08-29 13:21
閱讀 1815·2019-08-29 11:07