1. 程式人生 > >PHP命名空間

PHP命名空間

smart jin ron nbsp 開發 如果 park 讓我 rdquo

命名空間

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命名空間