PHP命名空間
命名空間
namespace命名空間
1. 什麽是命名空間
在php程序語言裏邊,語法規則要求同名稱的函數、類名、常量在一個請求裏邊不允許出現多次。如果有的應用程序(例如tp框架中有smarty、視頻方法插件,他們有同名稱的多個元素)不得已必須出現多個同名的 函數、類名、常量,那麽我們就可以把它們放到不同的空間裏邊做請求。這個不同的空間就稱作“命名空間”。
2. 使用命名空間
通過namespace關鍵字聲明命名空間。
namespace 空間名稱;
(空間名稱 按照php正確的命名方式定義即可)
命名空間針對 函數、類名、const常量 三部分起作用,並統稱為“元素”。
常量的聲明:
define(名稱,值); //(在類外部聲明常量)與命名空間沒有關系
//同名稱常量只能define一次
const 名稱=值; //與命名空間有關系
① const可以在類的內部聲明常量信息(類常量)
② const也可以在類外部聲明常量(正常常量)
使用命名空間的時候const可以放到類外部聲明常量。
同名稱的多個常量,可以分別定義到不同的“命名空間”裏邊
const和define的區別:
前者針對命名空間發生影響,後者不發生影響。
const可以聲明多個同名稱的常量
define對同名稱常量只能聲明一個
命名空間三種元素聲明及訪問:
3. 子級(多級)空間
命名空間可以讓我們存放許多元素(函數、類、常量),有的時候元素比較多,為了管理方便,可以對元素進行分門別類地存儲。也就是說命名空間可以設置為多級空間。多級空間的最後一級空間就稱為“子級空間”
多級空間的聲明和訪問元素:
3.1 空間元素訪問的三種形式
① 非限定名稱
echo USER; 就近訪問上邊與其挨著最近空間的USER元素
(類似php引入文件:include “common.php”; 相對路徑
引入當前目錄下的common.php文件)
② 限定名稱
echo softpark\USER; 把當前空間 和 softpark空間聯合獲得USER元素
(類似php引入文件:include “Common/Conf/config.php”; 相對路徑)
③ 完全限定名稱
echo \beijing\haidian\xisanqi\USER; 訪問beijing\haidian\xisanqi空間的USER元素
(類似php引入文件:include “d:/web/1121/Conf/common.php”; 絕對路徑引入文件)
三種方式訪問元素:
限定名稱方式“巧合”訪問到一個具體元素:
4.引入機制
命名空間可以聲明為多級空間,這個多級空間元素在其他空間內部訪問的時候,不得已需要通過 完全限定名稱 方式,這個完全限定名稱不方便開發、維護、使用,為了降低代碼的復雜度,可以在當前的空間把指定的空間給引入進來,進而可以方便地通過“限定名稱”的方便的形式使用其他空間的元素。
4.1 空間引入
use 空間;
4.2 類元素引入
use 空間\空間\空間\類元素;
空間引入 可以解決完全限定名稱訪問元素的繁瑣性,但是還需要通過“限定名稱”方式訪問,仍然不夠簡便,如果引入空間的元素是類,就可以直接把這個類引入到當前空間,使用的時候也就可以通過“非限定名稱”方式訪問,非常便捷。
(只能做“類元素”引入,函數和常量不可以)
4.2.1 別名使用
use 空間\元素 as 別名;
把其他空間的一個“類元素”引入到當前空間,如果當前空間也有一個“同名”的類元素,則引入元素 與 當前空間元素就會有沖突,為了避免沖突產生,可以給引入空間元素起一個別名。
引入類元素 與 當前空間類元素同名,有沖突:
5. 公共空間
一個php文件裏邊沒有namespace關鍵字聲明,則該文件的元素都存在於“公共空間”
訪問公共空間的元素統一設置為: \元素
舉例子:
兩個文件:a.php b.php (a.php include引入b.php)
1 a.php有namespace b.php沒有 (b.php處於公共空間)
被引入的文件空間針對當前空間不發生影響。
通過“非限定名稱”訪問訪問一個元素(函數、常量)
① 首先獲得本空間元素
② 其次獲得公共空間元素
a.php 沒有namespace b.php有namespace (a.php處於公共空間)
6. 命名空間使用註意
1) 聲明命名空間的當前腳本的第一個namespace關鍵字前面不能有任何代碼(header頭代碼也要寫在下邊)
2) 命名空間是虛擬抽象的空間,不是真實存在的目錄
3) 同一請求的多個文件可以使用同名稱的命名空間,
只要這些文件裏邊不出現多個同名稱、同類型的元素就可以
PHP命名空間