命名空間的作用
解決文件中引用另一個文件時存在相同類名,函數名以及常量名的問題,比如test.php文件如下
然後在test1.php中加載這個文件
如果兩者的命名空間相同,包括兩者都沒有設置命名空間的情況下,執行test1.php會報衝突,因爲兩個文件有相同的類Test,這是不被允許的,然而命名空間可以很好的解決這個問題,如果將test1.php的命名空間進行修改,如下:
現在兩個文件的類Test在不同的命名空間下,因此不會發生衝突,不過具體要實例化哪個類,且看下文分析
use的作用
use只是用來使命名空間引用時更簡潔,比如我們想使用類app\first\Test,那麼我們只需要在開頭加
use app\first\Testh 或者 use app\first\Test as Test
以後就不用麻煩的寫全命名空間,直接new Test,就制定了app\first這個命名空間,總結的說use就是一個設置別名的作用
上圖實例化的就是app\first下的Test類,
這裏需要注意的是,use的別名不能等於當前文件中的類名!!
命名空間類名
php的命名空間類名總有三種方式
非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod(),foo 將被解析爲 currentnamespace\foo
限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(),如果當前的命名空間是 currentnamespace,則 foo 被解析爲currentnamespace\subnamespace\foo
完全限定名稱,或包含了全局前綴操作符的名稱,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在這種情況下,foo 總是被解析爲代碼中的文字名(literal name)currentnamespace\foo。
下面從官網找來一張圖,詳細的介紹了類名的引用
<?php
namespace A;
use B\D, C\E as F;
// 函數調用
foo(); // 首先嚐試調用定義在命名空間"A"中的函數foo()
// 再嘗試調用全局函數 "foo"
\foo(); // 調用全局空間函數 "foo"
my\foo(); // 調用定義在命名空間"A\my"中函數 "foo"
F(); // 首先嚐試調用定義在命名空間"A"中的函數 "F"
// 再嘗試調用全局函數 "F"
// 類引用
new B(); // 創建命名空間 "A" 中定義的類 "B" 的一個對象
// 如果未找到,則嘗試自動裝載類 "A\B"
new D(); // 使用導入規則,創建命名空間 "B" 中定義的類 "D" 的一個對象
// 如果未找到,則嘗試自動裝載類 "B\D"
new F(); // 使用導入規則,創建命名空間 "C" 中定義的類 "E" 的一個對象
// 如果未找到,則嘗試自動裝載類 "C\E"
new \B(); // 創建定義在全局空間中的類 "B" 的一個對象
// 如果未發現,則嘗試自動裝載類 "B"
new \D(); // 創建定義在全局空間中的類 "D" 的一個對象
// 如果未發現,則嘗試自動裝載類 "D"
new \F(); // 創建定義在全局空間中的類 "F" 的一個對象
// 如果未發現,則嘗試自動裝載類 "F"
// 調用另一個命名空間中的靜態方法或命名空間函數
B\foo(); // 調用命名空間 "A\B" 中函數 "foo"
B::foo(); // 調用命名空間 "A" 中定義的類 "B" 的 "foo" 方法
// 如果未找到類 "A\B" ,則嘗試自動裝載類 "A\B"
D::foo(); // 使用導入規則,調用命名空間 "B" 中定義的類 "D" 的 "foo" 方法
// 如果類 "B\D" 未找到,則嘗試自動裝載類 "B\D"
\B\foo(); // 調用命名空間 "B" 中的函數 "foo"
\B::foo(); // 調用全局空間中的類 "B" 的 "foo" 方法
// 如果類 "B" 未找到,則嘗試自動裝載類 "B"
// 當前命名空間中的靜態方法或函數
A\B::foo(); // 調用命名空間 "A\A" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\A\B" 未找到,則嘗試自動裝載類 "A\A\B"
\A\B::foo(); // 調用命名空間 "A\B" 中定義的類 "B" 的 "foo" 方法
// 如果類 "A\B" 未找到,則嘗試自動裝載類 "A\B"
?>
總結
命名空間應用非常廣泛,想要了解命名空間的運行原理還要去了解自動加載。這裏就不說了
如有不準確的地方歡迎指正