什麼是命名空間?引用官網上的一段話:php
從廣義上來講,命名空間是一種封裝事物的方法。在不少地方均可以見到這種抽象概念。例如,在操做系統中【目錄】用來將相關文件分組,對於【目錄】中的文件來講,它就扮演了命名空間的角色。舉個具體的栗子,在Windos操做系統中,文件 foo.txt 能夠同時在目錄 d:/example1 和 d:/example2 中存在,但在同一個目錄中最多隻能存在一個 foo.txt 文件。另外,在【目錄】 之外訪問 foo.txt 文件時,咱們必須將正確【目錄】名以及【目錄】分隔符放在文件名以前。這個原理應用到程序設計領域就是命名空間的概念。數組
命名空間一般用來解決兩大類問題:函數
舉個栗子:你正在維護一個項目,其中有一個文件: Member.php
, 其中有一個功能:查詢全部用戶的基本資料,而後使用CSV文件導出,導出數據到CSV文件的功能是以前的一個哥們寫的:他把功能封裝到了一個方法裏:OutputStream()
。然而,很是不幸,此時客戶新增長了一個需求:導出用戶的所有資料,而且保留以前導出基本資料的功能。假設因爲個別緣由,你不想再使用以前那哥們寫的 OutputStream()
方法,須要借用第三方類庫:PHPExcel
,最後當你配置成功而且載入類庫文件準備開工時,卻收到了錯誤信息:OutputStream()
方法重複了(這裏假設 PHPExcel
類庫中也有一個方法叫作 OutputStream()
, 若是能有個惟一標識該多好?spa
回到剛纔的問題,爲了解決 OutputStream()
方法衝突問題,你想到了一個辦法:把以前那哥們寫的 OutputStream()
加一個項目前綴:My_OutputStream()
, 而後大功告成(若是 OutputStream()
只有一處地方調用)。然而,隨着項目的日積月累,項目中相似 My_…()
這種代碼愈來愈多,維護也變得日益麻煩。操作系統
PHP命名空間中能夠包含任意的PHP代碼,可是最終只有三種類型會受到影響:類、函數、常量,變量和數組等是沒有命名空間的概念的。.net
1.命名空間使用 namespace 來聲明;
2.若是一個文件中包括命名空間,它必須在全部 PHP 代碼前聲明命名空間;
3.全部非 PHP 代碼包括空白符都不能出如今命名空間的聲明前;設計
簡單地來講,若是你要在一個文件中使用命名空間,這樣寫就對了:code
namespace FrameWork\MyFrameWork;
與目錄和文件的關係很象,PHP命名空間也容許指定層次化的命名空間的名稱。所以,命名空間的名字可使用分層次的方式定義:ip
namespace FrameWork\MyFrameWork; namespace FrameWork\MyFrameWork\Model; namespace FrameWork\MyFrameWork\Controller;
這個功能你們知道便可,在實際的項目開發中,應該不會出如今同一個文件中定義多個命名空間的這種狀況。
詳情請看官方文檔:在同一個文件中定義多個命名空間開發
例如一個類爲 Controller
, 若是當前命名空間是 FrameWork
, Controller
會被解析爲 FrameWork\Controller
.若是當前命名空間不存在,則 Controller
是全局的。
例如 $exampe = Base\Example()
, 若是當前命名空間是 Controller
, 則 Example
會被解析爲 Controller\Base\Example
, 若是當前命名空間是 Model
, 則 Example
會被解析爲 Model\Base\Example
, 若是當前命名空間不存在,則 Exampl
會被解析爲 Base\Example
, (PS:這種解析方式相似 Windows 中相對路徑)。
例如 $exampe = \Base\Example()
, 則 Example
會被解析爲 Base\Example
, (PS:這種解析方式相似 Windows 中絕對路徑)。
小技巧:最前面有 「” 是絕對路徑,反之是相對路徑。
舉個栗子:
/** * namespace2.php */ namespace FrameWork\Base\Controller; class Example { public static function here() { echo 'Namespace is FrameWork\Base\Controller !!<br />'; } } /** * namespace1.php */ namespace FrameWork\Base; class Example { public static function here() { echo 'Namespace is FrameWork\Base !!<br />'; } } include ('namespace3.php'); // 第一種解析方式: Example::here(); // Namespace is FrameWork\Base !! // 第二種解析方式: Controller\Example::here(); // Namespace is FrameWork\Base\Controller !! // 第三種解析方式: \FrameWork\Base\Example::here(); // Namespace is FrameWork\Base !! \FrameWork\Base\Controller\Example::here(); // Namespace is FrameWork\Base\Controller !!
namespace: 用來顯式訪問當前命名空間或子命名空間中的元素。
namespace\Example::here(); // Namespace is FrameWork\Base !!
__NAMESPACE__ : 當前命名空間的字符, 若是當前命名空間爲空, 則返回」。
echo __NAMESPACE__; // FrameWork\Base
PHP 命名空間支持兩種別名方式:爲類名稱使用別名、爲命名空間名稱使用別名。注意:PHP不支持函數或常量別名。
經過操做符 use 實現別名。
/** * namespace4.php */ namespace FrameWork\Base\Controller; class Example { public static function here() { echo 'Namespace is FrameWork\Base\Controller !!<br />'; } } /** * namespace3.php */ namespace Model; include ('namespace4.php'); use FrameWork\Base\Controller\Example as FBCExample; \FrameWork\Base\Controller\Example::here(); // Namespace is FrameWork\Base\Controller !! FBCExample::here(); // Namespace is FrameWork\Base\Controller !!