相比C#等語言,你可以在php函數裡面隨意定義變數並賦值,而不用擔心覆蓋了全域變數,或者類變數;你也可以隨意的定義類變數,而不用擔心會和函數名衝突,因為變數前面都有個$。
php的命名空間和全域變數、局部變數的設計思想一樣,都是為了儘可能的減少命名衝突。php的命名空間可以和檔案系統類似,有相對命名空間和絕對命名空間。
定義命名空間
必須是第一個語句,前面不能有任何語句,注釋可以。
必須是絕對命名空間。
namespace bookrpg\config;//或者namespace bookrpg\config{}namespace \bookrpg\config; //錯誤,不能有前置\12345678910
匯入命名空間
必須是絕對命名空間。
use bookrpg\config\ClassName;use \bookrpg\config\ClassName; //可以有前置\,但不建議加use bookrpg\config\ClassName as NewClassName;use Exception;use \Exception; //可以有前置\,但不建議加123456
使用命名空間
使用絕對命名空間
$cls = new \bookrpg\config\ClassName();class MyException extends \Exception{}123456
使用相對命名空間
namespace bookrpg{ //等同於new \bookrpg\config\ClassName(); $cls = new config\ClassName(); //錯誤,php會認為是\bookrpg\Exception,而不是全域類Exception $ex = new Exception(); }123456789
怪異的地方
C++、Java、C#都有相似的命名空間概念,而php的命名空間不跟隨大流,有自己的一套獨立的思想,對於先入為主的人來來說就顯得怪異和令人迷惑。
命名空間中居然有反斜線?
點號(.)已經被用作字串串連符了,又要區分絕對和相對命名空間,new .a.b.c()太不美觀,所以選擇反斜線吧。
一旦使用了命名空間,使用全域類也要加上“\”或者use一下,累不累呀?
沒辦法,為了嚴格類比檔案系統的概念,也為了隨便定義類名,而不用擔心類名衝突。
既然是嚴格類比檔案系統,為什麼定義和匯入命名空間的時候,前面不加\呢?
只能說,php的設計者不是完美主義者。
但php的命名空間確實缺乏邏輯完美性:
前置\的使用不統一,同樣是絕對命名空間,定義的時候不允許用,匯入的時候卻允許用。
即使是全域類,在非全域命名空間下,也必須使用前置\,而全域函數和變數又不受此限制。
使用建議
定義和匯入命名空間的時候,統一不加前置\
所有的類都使用use匯入,包括全域類,只命名空間類,有衝突的就as一下
禁止直接使用相對命名空間
理解了php命名空間的設計思想,並避免其設計不完美的地方,這樣看來php的命名空間也是很容易接受的。
上面是我整理給大家的php命名空間的設計思想和缺點,希望今後會對大家有協助。
相關文章:
PHP依賴倒置案例詳解
詳解php語言中的Laravel架構
PHP守護進程化的實現的方法