1 命名空間綜述
在C#和Java中都有命名空間的概念,而在PHP中,命名空間在PHP 5.3版本中首次加入的,以前的版本沒有這個功能。
1.1 為什么要使用命名空間?
做項目時,一個文件可能會引入多個文件。如果不使用命名空間,引入的多個文件中可能存在同名的類、函數、常量,就會報錯(重復定義的錯誤)。
以函數為例,演示如下:
1.1.1 不使用命名空間:
運行結果:
1.1.2 使用命名空間:
只在上述代碼中修改b.php文件,如下:
再次訪問,則不會報錯,運行結果:
1.2 使用命名空間 優勢
簡單的說,就是解決代碼沖突。具體如下:
- 使用框架、第三方類庫,可以避免的類、函數、常量的沖突。
- 可以分工協作,有利於多人同時開發一個項目,提高開發效率。
2 定義命名空間
如上1.1.2所示,一旦namespace聲明了命名空間,后面的代碼都屬於該空間。
- 在定義的命名空間之前不能有任何輸出。如html代碼等。
- 在聲明命名空間之前唯一合法的代碼是用於定義源文件編碼方式的 declare 語句,如:declare(encoding='UTF-8');
- 項目中,只在一個php文件的開頭進行定義命名空間,並且只定義一個。
- 通常該命名空間要遵循PSR-0命名規范(命名空間和目錄結構保持一致)。
3 空間分類
分為兩類:全局空間 和 命名空間
3.1 全局空間
不在namespace聲明的空間里面的代碼都屬於全局空間。
3.2 命名空間
如:namespace Think;
如:namespace Think\Controller; 這種反斜線分割的、層次化的,就是子命名空間。
如果需要在命名空間使用全局空間的類、函數、常量,在調用時,需要加上反斜線(代表全局空間)。
4 命名空間的使用
4.1使用限定名稱、非限定名稱訪問
- 非限定名稱: 訪問當前命名空間。(在當前文件中直接使用)
- 限定名稱: 類似於相對路徑,訪問當前空間下的子命名空間,如:new People\Person();
- 完全限定名稱:類似於絕對路徑,訪問全局空間,如:new \Person();實例化全局空間下的Person類
4.2 導入 命名空間,然后直接使用
語法:use 命名空間,可以起別名(as 別名)。
目的:在當前文件中使用其他命名空間的 類、函數、常量。(使用時,就不用加上限定名稱)