PHP命名空间学习笔记
命名空間的支持版本:PHP 5 > 5.3.0,PHP 7 。
什么是命名空間
從廣義上來(lái)說(shuō),命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統(tǒng)中目錄用來(lái)將相關(guān)文件分組,對(duì)于目錄中的文件來(lái)說(shuō),它就扮演了命名空間的角色。具體舉個(gè)例子,文件 foo.txt 可以同時(shí)在目錄/home/greg 和 /home/other 中存在,但在同一個(gè)目錄中不能存在兩個(gè) foo.txt 文件。另外,在目錄 /home/greg 外訪問(wèn) foo.txt 文件時(shí),我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個(gè)原理應(yīng)用到程序設(shè)計(jì)領(lǐng)域就是命名空間的概念。
在PHP中,命名空間用來(lái)解決在編寫類庫(kù)或應(yīng)用程序時(shí)創(chuàng)建可重用的代碼如類或函數(shù)時(shí)碰到的兩類問(wèn)題:
- 用戶編寫的代碼與PHP內(nèi)部的類/函數(shù)/常量或第三方類/函數(shù)/常量之間的名字沖突。
- 為很長(zhǎng)的標(biāo)識(shí)符名稱(通常是為了緩解第一類問(wèn)題而定義的)創(chuàng)建一個(gè)別名(或簡(jiǎn)短)的名稱,提高源代碼的可讀性。
PHP 命名空間提供了一種將相關(guān)的類、函數(shù)和常量組合到一起的途徑。
定義命名空間
命名空間通過(guò)關(guān)鍵字namespace 來(lái)聲明。聲明命名空間的語(yǔ)句必須是文件的第一行語(yǔ)句,除了一個(gè)以外:declare關(guān)鍵字。在聲明命名空間之前唯一合法的代碼是用于定義源文件編碼方式的 declare 語(yǔ)句。另外,所有非 PHP 代碼包括空白符都不能出現(xiàn)在命名空間的聲明之前。同一個(gè)命名空間可以定義在多個(gè)文件中,即允許將同一個(gè)命名空間的內(nèi)容分割存放在不同的文件中。
<?php namespace MyProject;const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ }?>同目錄具有層次結(jié)構(gòu)類似,命名空間也支持指定層次化的命名空間名稱。
<?php namespace MyProject\Sub\Level;const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ }?>上面的例子創(chuàng)建了常量MyProject\Sub\Level\CONNECT_OK,類 MyProject\Sub\Level\Connection和函數(shù) MyProject\Sub\Level\connect。
PHP還支持在同一個(gè)文件中定義不同的命名空間,但是非常不建議這種用法,這里就不多說(shuō)了。
這里我有一個(gè)疑問(wèn),上面說(shuō)命名空間定義必須是文件的第一行代碼,那在一個(gè)文件中定義多個(gè)命名空間不就是會(huì)出現(xiàn)不在第一行的情況?
針對(duì)這個(gè)問(wèn)題試驗(yàn)了一下,對(duì)于一個(gè)文件中包含多個(gè)命名空間的,必須所有的代碼都在某一個(gè)命名空間中,否則就會(huì)報(bào)Fatal error: No code may exist outside of namespace {} in的錯(cuò)誤,對(duì)于全局代碼,那就放在全局的命名空間中,類似這樣namespace { }
使用命名空間
PHP 命名空間中的元素可以通過(guò)三種方式引用,以類名為例:
NAMESPACE 常量
常量__NAMESPACE__的值是包含當(dāng)前命名空間名稱的字符串。在全局的,不包括在任何命名空間中的代碼,它包含一個(gè)空的字符串。
namespace 關(guān)鍵字
關(guān)鍵字 namespace 可用來(lái)顯式訪問(wèn)當(dāng)前命名空間或子命名空間中的元素。它等價(jià)于類中的 self 操作符。
使用命名空間
所有支持命名空間的PHP版本支持三種別名或?qū)敕绞?#xff1a;為類名稱使用別名、為接口使用別名或?yàn)槊臻g名稱使用別名。PHP 5.6開始允許導(dǎo)入函數(shù)或常量或者為它們?cè)O(shè)置別名。在PHP中,別名是通過(guò)操作符 use 來(lái)實(shí)現(xiàn)的.
<?php namespace foo; use My\Full\Classname as Another;// 下面的例子與 use My\Full\NSname as NSname 相同 use My\Full\NSname;// 導(dǎo)入一個(gè)全局類 use ArrayObject;// importing a function (PHP 5.6+) use function My\Full\functionName;// aliasing a function (PHP 5.6+) use function My\Full\functionName as func;// importing a constant (PHP 5.6+) use const My\Full\CONSTANT;$obj = new namespace\Another; // 實(shí)例化 foo\Another 對(duì)象 $obj = new Another; // 實(shí)例化 My\Full\Classname 對(duì)象 NSname\subns\func(); // 調(diào)用函數(shù) My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對(duì)象 // 如果不使用 "use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對(duì)象 func(); // calls function My\Full\functionName echo CONSTANT; // echoes the value of My\Full\CONSTANT ?>注意對(duì)命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 Foo\Bar以及相對(duì)的不包含命名空間分隔符的全局名稱如 FooBar)來(lái)說(shuō),前導(dǎo)的反斜杠是不必要的也不推薦的,因?yàn)閷?dǎo)入的名稱必須是完全限定的,不會(huì)根據(jù)當(dāng)前的命名空間作相對(duì)解析。為了簡(jiǎn)化操作,PHP還支持在一行中使用多個(gè)use語(yǔ)句。
如果沒(méi)有定義任何命名空間,所有的類與函數(shù)的定義都是在全局空間,與 PHP 引入命名空間概念前一樣。在名稱前加上前綴 ?表示該名稱是全局空間中的名稱,即使該名稱位于其它的命名空間中時(shí)也是如此。
參考資料:
1、PHP 命名空間
總結(jié)
以上是生活随笔為你收集整理的PHP命名空间学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ASP.NET WEBAPI设计(文摘)
- 下一篇: jdbc详解:1、创建数据库connec