## PHP命名空間
###1. 什么是命名空間?
> 從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。
例如,在操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。
具體舉個例子,文件 foo.txt 可以同時在目錄/home/one 和 /home/other 中存在,但在同一個目錄中不能存在兩個
foo.txt 文件。
另外,在目錄 /home/one 外訪問 foo.txt 文件時,
我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/one/foo.txt。這個原理應用到程序設計領域就是命名空間
的概念。
### 2. 命名空間解決的問題
> 1. 用戶編寫的代碼與PHP內部的類/函數/常量或第三方類/函數/常量之間的名字沖突(解決名字沖突)
> 2. 為很長的標識符名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高源代碼的可讀性。
### 3. 如何使用命名空間及使用中要注意的事項
> 創建命名空間需要使用namespace關鍵詞。
~~~
<?php
// 創建
namespace Blog;
?>
~~~
>[danger] 創建當前腳本第一個命名空間前面不能有任何代碼,下面的寫法都是錯誤的:
~~~
<?php
$name = "test";
namespace Article;
?>
~~~
~~~
<html></html>
<?php
namespace Article;
?>
~~~
>[info] 為什么強調說第一個命名空間呢?因為同一個腳本中可以創建多個命名空間。在不同的空間中,可以調用不同的元素。如:
~~~
<?php
//創建一個名為'Article'的命名空間
namespace Article;
//此Comment屬于Article空間的元素
class Comment{}
//創建一個名為MessageBoard的命名空間
namespace MessageBoard;
//此Comment屬于MessageBoard命名空間
class Comment{}
?>
~~~
>[info] 子命名空間,命名空間的調用語法像文件路徑一樣,這允許我們自定義子空間來描述各個空間之間的關系。如果上面Article和MessageBoard都同屬于一個Blog項目內,那么我們用命名空間就得這樣表示:
~~~
<?php
//創建一個名為'Article'的命名空間
namespace Blog\Article;
//此Comment屬于Article空間的元素
class Comment{}
//創建一個名為MessageBoard的命名空間
namespace Blog\MessageBoard;
//此Comment屬于MessageBoard命名空間
class Comment{}
//調用當前空間的類,即Blog\MessageBorad下的Comment
$comment = new Comment();
//調用Blog\Article空間的類
$article_comment = new \Blog\Article\Comment()
?>
~~~
>[info] 公共空間, 沒有用namespace限制命名空間,則文件里的函數及類的命名空間則為公共空間。如我一個助手文件UtilityHelper.php文件:
~~~
<?php
function dd(){}
class CurlHelper{}
?>
~~~
>[info] 當公共空間文件引入非公共空間文件時,該腳本里的函數不會屬于引入的命名空間,它始終處于公共空間內。
~~~
<?php
namespace Blog;
require 'UtilityHelper.php';
//實例化例時,它僅會在指定或當前的命名空間下查找,如:
$curl = new CurlHelper();//這個僅會查找當前命名空間,Blog\CurlHelper,結果出現了致命錯誤;
$curl = new \CurlHelper();//會有公共空間查找,正確!
~~~
>[info] 調用公共空間的方式就是在直接元素的名稱前面加\即可。
### 4. 名稱術語
>[info] 非限定名稱,或不含前綴的類名稱,其實就是目錄路徑中的相對路徑。如:
~~~
<?php
namespace Blog;
class Comment{}
//這就是非限定名稱,它調用的是當前命名空間Blog下的Comment類
$comment = new Comment();
?>
~~~
>[info] 限制名稱,或包含前綴的名稱。其實就是類名稱的最左邊沒有反斜線。如:
~~~
<?php
namespace Blog;
class Comment{}
//這就是限定名稱,它調用的是當前命名空間Blog\Article下的Comment類
$comment = new Article\Comment();
?>
~~~
>[info] 完全限定名稱,或包含全局前綴的名稱(反斜線)。其實就是類名的最左邊加了反斜線。如:
~~~
<?php
namespace Blog;
class Comment{}
//這就是完全限定名稱,它調用的是當前命名空間Article下的Comment類
$comment = new \Article\Comment();
?>
~~~
### 5. 導入命名空間(use)及命名空間的別名(as)
>[info] 使用use導入命名空間
~~~
<?php
namespace Blog;
//導入命名空間
use abc;
//如果導入的命名空間出現沖突時,用as別名,如
use Blog\abc as Babc;
?>
~~~
<embed src="http://www.tudou.com/v/9eT0KMlnZNc/&bid=05&rpid=1059277519&resourceId=1059277519_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="865" height="523"></embed>
百度下載地址:http://pan.baidu.com/s/1geTnrpD
TP5粉絲群: 543608226
TP5底層答疑群: 451935051