從PHP5.3.0開始引入命名空間的概念,那么命名空間是什么、為什么要使用命名空間、怎么使用命名空間呢?下面就給大家簡單的講解一下,相信讀完這篇文章大家能對命名空間有比較清楚的認識。
一、命名空間是什么?
命名空間是現代PHP特性之一,從PHP5.3.0開始引入,其作用是將PHP代碼按照一種虛擬的層次結構進行組織,這種結構類似於操作系統中文件系統的目錄結構。下面看一個例子

第三行:namespace App\Model; 是PHP命名空間的聲明語句,命名空間聲明時要放在<?php 后的第一行。這樣寫之后 User 就被定位到命名空間 App\Model 中。
雖然命名空間類似於操作系統的物理文件系統,但有本質的不同。命名空間是一種虛擬的概念,沒必要和文件系統中的目錄結構完全相同。例如 User 在命名空間 App\Model 中, 但真實的文件目錄卻是 app\User.php 並沒有 model 目錄。 不過為了兼容PSR-4自動加載標准,一般都會把命名空間放到對應的文件系統的目錄中。可以說命名空間的為現代PHP生態系統和基於組件的新型架構的實現奠定了堅實的基礎。
二、為什么要使用命名空間
在通常的PHP開發中,除了使用自己的代碼以外,往往會使用很多其他的PHP組件。這些組件代碼可能會使用相同的類名、接口名、函數或者常量名等,如果不使用命名空間就會導致命名沖突,使PHP執行出錯。而將代碼放到各自唯一的命名空間中,我們的代碼就可以和其他開發者使用相同的類名、接口名、函數或者常量名等,這在團隊合作中相當重要。
在引入第三方組件依賴時,命名空間往往說明了開發此組件的廠商或組織。例如

在laravel框架中 TokenGuard 就位於廠商命名空間 Illuminate 中。
三、怎么使用命名空間
1、聲明命名空間
聲明命名空間:在<?php 后的第一行聲明,聲明語句以 namespace 開頭,隨后是一個空格,然后是命名空間的名稱,最后以 ;結尾。
namespace Wilin;
通常命名空間的開頭用於設置頂層廠商名,這個例子中設置廠商名為 Wilin 。在這個命名空間聲明語句后聲明的所有PHP類、接口、函數和常量等都在 Wilin 命名空間中。如果在該命名空間下想要組織代碼,可以使用子命名空間,只要使用 \ 把命名空間和子命名空間分開就好了。例如:
namespace Wilin/Model;
這個命名空間中的類、接口、函數和常量等都在 Wilin\Model 命名空間中。
廠商命名空間是最頂層的命名空間,也是最重要的命名空間,用於識別品牌或組織,必須具有全局唯一性。子命名空間相對而言沒那么重要,但是可以用於組織項目的代碼。
2、全局命名空間
如果在當前的命名空間中引用的類、接口、函數和常量沒有指定命名空間,PHP則會認為它處於全局命名空間中。在命名空間中引用全局的代碼時需要在類、接口、函數或常量前加 \ 符號。例如原生的Exception類:

3、三種名稱術語
- 非限定名稱,或不包含前綴的類名稱:如果當前命名空間是 Wilin\Model ,對於 $user = new User(); 。User 將被解析為 Wilin\Model\User ,如果當前命名是全局命名空間,則會被解析為 User 。
- 限定名稱,或包含前綴的名稱:如果當前命名空間是 Wilin ,對於 $user = new Model\User(); 。User 將被解析為 Wilin\Model\User ,如果當前命名是全局命名空間,則會被解析為 Model\User。
- 完全限定名稱,或包含了全局前綴操作符的名稱:對於 $user = new \Wilin\Model\User(); 。在這種情況下,無論當前命名空間是什么 User 都將被解析為 Wilin\Model\User 。
下面給出具體例子:

4、導入&別名
上述 一、 中的 User 的全名是 App\Model\User ,如果我們想在其他地方使用這個類就要把全名寫出來,而導入可以解決這個問題。
導入是指使用 use 關鍵字告訴PHP我們想使用哪個命名空間、類、接口、函數和常量,導入以后就不用再寫全名了。例如:

如果這樣類名還是長或者想給該類另起一個名字,可以使用 as 來創建別名。將上圖中第12行和17行分別改成下面這樣既可。
use App\Model\User as U;
$user = new U();
如果想要在PHP文件中導入多個類、接口、函數或常量,需要在PHP文件的頂部使用多個use語句,PHP支持用簡短的語法把多個use語句寫成一行。例如:
<?php
use App\Model\Admin;
use App\Model\User;
寫成
<?php
use App\Model\Admin,App\Model\User;
不過這樣可讀性差,還是一行寫一個use語句比較好。
