瞭解命名空間

命名空間的作用

解決文件中引用另一個文件時存在相同類名,函數名以及常量名的問題,比如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的命名空間類名總有三種方式

  1. 非限定名稱,或不包含前綴的類名稱,例如 $a=new foo(); 或 foo::staticmethod(),foo 將被解析爲 currentnamespace\foo

  2. 限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo(),如果當前的命名空間是 currentnamespace,則 foo 被解析爲currentnamespace\subnamespace\foo

  3. 完全限定名稱,或包含了全局前綴操作符的名稱,例如, $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"
?>

總結

命名空間應用非常廣泛,想要了解命名空間的運行原理還要去了解自動加載。這裏就不說了

如有不準確的地方歡迎指正
發佈了29 篇原創文章 · 獲贊 22 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章