php命名空間設(shè)計(jì)思想、用法與缺點(diǎn)分析
本文實(shí)例講述了php命名空間設(shè)計(jì)思想、用法與缺點(diǎn)。分享給大家供大家參考,具體如下:
相比C#等語(yǔ)言,你可以在php函數(shù)里面隨意定義變量并賦值,而不用擔(dān)心覆蓋了全局變量,或者類變量;你也可以隨意的定義類變量,而不用擔(dān)心會(huì)和函數(shù)名沖突,因?yàn)樽兞壳懊娑加袀€(gè)$。
php的命名空間和全局變量、局部變量的設(shè)計(jì)思想一樣,都是為了盡可能的減少命名沖突。php的命名空間可以和文件系統(tǒng)類似,有相對(duì)命名空間和絕對(duì)命名空間。
定義命名空間
必須是第一個(gè)語(yǔ)句,前面不能有任何語(yǔ)句,注釋可以。
必須是絕對(duì)命名空間。
namespace bookrpg\config; //或者 namespace bookrpg\config { } namespace \bookrpg\config; //錯(cuò)誤,不能有前導(dǎo)\
導(dǎo)入命名空間
必須是絕對(duì)命名空間。
use bookrpg\config\ClassName; use \bookrpg\config\ClassName; //可以有前導(dǎo)\,但不建議加 use bookrpg\config\ClassName as NewClassName; use Exception; use \Exception; //可以有前導(dǎo)\,但不建議加
使用命名空間
使用絕對(duì)命名空間
$cls = new \bookrpg\config\ClassName(); class MyException extends \Exception { }
使用相對(duì)命名空間
namespace bookrpg { //等同于new \bookrpg\config\ClassName(); $cls = new config\ClassName(); //錯(cuò)誤,php會(huì)認(rèn)為是\bookrpg\Exception,而不是全局類Exception $ex = new Exception(); }
怪異的地方
C++、Java、C#都有相似的命名空間概念,而php的命名空間不跟隨大流,有自己的一套獨(dú)立的思想,對(duì)于先入為主的人來來說就顯得怪異和令人迷惑。
-
命名空間中居然有反斜杠?
點(diǎn)號(hào)(.)已經(jīng)被用作字符串連接符了,又要區(qū)分絕對(duì)和相對(duì)命名空間,new .a.b.c()太不美觀,所以選擇反斜杠吧。
-
一旦使用了命名空間,使用全局類也要加上“\”或者use一下,累不累呀?
沒辦法,為了嚴(yán)格類比文件系統(tǒng)的概念,也為了隨便定義類名,而不用擔(dān)心類名沖突。
-
既然是嚴(yán)格類比文件系統(tǒng),為什么定義和導(dǎo)入命名空間的時(shí)候,前面不加\呢?
只能說,php的設(shè)計(jì)者不是完美主義者。
但php的命名空間確實(shí)缺乏邏輯完美性:
- 前導(dǎo)\的使用不統(tǒng)一,同樣是絕對(duì)命名空間,定義的時(shí)候不允許用,導(dǎo)入的時(shí)候卻允許用。
- 即使是全局類,在非全局命名空間下,也必須使用前導(dǎo)\,而全局函數(shù)和變量又不受此限制。
使用建議
- 定義和導(dǎo)入命名空間的時(shí)候,統(tǒng)一不加前導(dǎo)\
- 所有的類都使用use導(dǎo)入,包括全局類,只命名空間類,有沖突的就as一下
- 禁止直接使用相對(duì)命名空間
理解了php命名空間的設(shè)計(jì)思想,并避免其設(shè)計(jì)不完美的地方,這樣看來php的命名空間也是很容易接受的。
更多關(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常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
PHP實(shí)現(xiàn)創(chuàng)建微信自定義菜單的方法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)創(chuàng)建微信自定義菜單的方法,結(jié)合實(shí)例形式分析了php創(chuàng)建微信自定義菜單的原理、步驟與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07phpmyadmin 3.4 空密碼登錄的實(shí)現(xiàn)方法
很多時(shí)候我們?cè)诒緳C(jī)測(cè)試時(shí)會(huì)將root用戶密碼設(shè)置為空。2010-05-05php自動(dòng)適應(yīng)范圍的分頁(yè)代碼
分享一個(gè)自己寫的“頁(yè)碼自動(dòng)適應(yīng)范圍”的分頁(yè)代碼2008-08-08php實(shí)現(xiàn)的一個(gè)簡(jiǎn)單json rpc框架實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)的一個(gè)簡(jiǎn)單json rpc框架實(shí)例,本文給出了RPC服務(wù)端和客戶端代碼以及應(yīng)用實(shí)例,需要的朋友可以參考下2015-03-03php lcg_value與mt_rand生成0~1隨機(jī)小數(shù)的效果對(duì)比分析
下面小編就為大家?guī)硪黄猵hp lcg_value與mt_rand生成0~1隨機(jī)小數(shù)的效果對(duì)比分析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04關(guān)于初學(xué)PHP時(shí)的知識(shí)積累總結(jié)
本篇文章筆者初學(xué)PHP時(shí)的一些知識(shí)積累經(jīng)驗(yàn),需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)類及用法示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的簡(jiǎn)單分頁(yè)類及用法,結(jié)合實(shí)例形式分析的PHP分頁(yè)類的功能、定義與具體使用技巧,需要的朋友可以參考下2016-05-05php正則取img標(biāo)記中任意屬性(正則替換去掉或改變圖片img標(biāo)記中的任意屬性)
因有一項(xiàng)目新聞發(fā)布系統(tǒng),數(shù)據(jù)庫(kù)內(nèi)容字段中存儲(chǔ)的是原圖的路徑(當(dāng)然還有其他文字內(nèi)容啦,內(nèi)容里插圖時(shí),存的是圖片路徑),但前臺(tái)想使用縮略圖,琢磨1小時(shí)余,得到以下結(jié)果,可解決問題2013-08-08