本文實例講述了php命名空間設計思想、用法與缺點。分享給大家供大家參考,具體如下:
相比C#等語言,你可以在php函數里面隨意定義變量并賦值,而不用擔心覆蓋了全局變量,或者類變量;你也可以隨意的定義類變量,而不用擔心會和函數名沖突,因為變量前面都有個$。
php的命名空間和全局變量、局部變量的設計思想一樣,都是為了盡可能的減少命名沖突。php的命名空間可以和文件系統類似,有相對命名空間和絕對命名空間。
定義命名空間
必須是第一個語句,前面不能有任何語句,注釋可以。
必須是絕對命名空間。
namespace bookrpg\config;
//或者
namespace bookrpg\config
{
}
namespace \bookrpg\config; //錯誤,不能有前導\
導入命名空間
必須是絕對命名空間。
use bookrpg\config\ClassName;
use \bookrpg\config\ClassName; //可以有前導\,但不建議加
use bookrpg\config\ClassName as NewClassName;
use Exception;
use \Exception; //可以有前導\,但不建議加
使用命名空間
使用絕對命名空間
$cls = new \bookrpg\config\ClassName();
class MyException extends \Exception
{
}
使用相對命名空間
namespace bookrpg
{
//等同于new \bookrpg\config\ClassName();
$cls = new config\ClassName();
//錯誤,php會認為是\bookrpg\Exception,而不是全局類Exception
$ex = new Exception();
}
怪異的地方
C++、Java、C#都有相似的命名空間概念,而php的命名空間不跟隨大流,有自己的一套獨立的思想,對于先入為主的人來來說就顯得怪異和令人迷惑。
-
命名空間中居然有反斜杠?
點號(.)已經被用作字符串連接符了,又要區分絕對和相對命名空間,new .a.b.c()太不美觀,所以選擇反斜杠吧。
-
一旦使用了命名空間,使用全局類也要加上“\”或者use一下,累不累呀?
沒辦法,為了嚴格類比文件系統的概念,也為了隨便定義類名,而不用擔心類名沖突。
-
既然是嚴格類比文件系統,為什么定義和導入命名空間的時候,前面不加\呢?
只能說,php的設計者不是完美主義者。
但php的命名空間確實缺乏邏輯完美性:
- 前導\的使用不統一,同樣是絕對命名空間,定義的時候不允許用,導入的時候卻允許用。
- 即使是全局類,在非全局命名空間下,也必須使用前導\,而全局函數和變量又不受此限制。
使用建議
- 定義和導入命名空間的時候,統一不加前導\
- 所有的類都使用use導入,包括全局類,只命名空間類,有沖突的就as一下
- 禁止直接使用相對命名空間
理解了php命名空間的設計思想,并避免其設計不完美的地方,這樣看來php的命名空間也是很容易接受的。
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《PHP網絡編程技巧總結》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- php的命名空間與自動加載實現方法
- PHP命名空間定義與用法實例分析
- PHP進階學習之命名空間基本用法分析
- PHP中命名空間的使用例子
- 實例講解PHP中使用命名空間
- PHP命名空間簡單用法示例
- PHP命名空間與自動加載類詳解
- PHP命名空間namespace及use的簡單用法分析
- 如何理解PHP核心特性命名空間