命名空間概述
什麼是命名空間?從廣義來說,命名空間是一種封裝事物的方法。在很多地方都可以看到這種抽象概念。例如,在作業系統中目錄用來將相關檔案分組,而對於目錄中的檔案來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 檔案。另外,在目錄 /home/greg 外存取 foo.txt 檔案時,我們必須將目錄名稱以及目錄分隔符號放在檔案名稱之前得到 /home/greg/foo.txt。這個原理應用在程式設計領域就是命名空間的概念。
在PHP中,命名空間用來解決在編寫類別庫或應用程式時創建可重複使用的程式碼如類別或函數時碰到的兩類問題:
使用者編寫的程式碼與PHP內部的類別/函數/常數或第三方類別/函數/常數之間的名字衝突。
為很長的識別碼名稱(通常是為了緩解第一類問題而定義的)創建一個別名(或簡短)的名稱,提高原始程式碼的可讀性。
PHP 命名空間提供了一種將相關的類別、函數和常數組合在一起的途徑。以下是說明 PHP 命名空間語法的範例:
Example #1 命名空間語法範例
<?php namespace my\name; class MyClass {} function myfunction() {} const MYCONST = 1; $a = new MyClass; $c = new \my\name\MyClass; $a = strlen('hi'); $d = namespace\MYCONST; $d = __NAMESPACE__ . '\MYCONST'; echo constant($d); ?>
PHP 在 5.3.0 以後的版本開始支援命名空間。
定義命名空間
雖然任意合法的PHP程式碼都可以包含在命名空間中,但只有三種類型的程式碼受命名空間的影響,它們是:類,函數和常數。
命名空間透過關鍵字namespace 來聲明。如果一個檔案中包含命名空間,它必須在其它所有程式碼之前聲明命名空間。
Example #1 宣告單一命名空間
<?php namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
在宣告命名空間之前唯一合法的程式碼是用來定義原始檔編碼方式的 declare 語句。另外,所有非PHP 程式碼包含空白符號都不能出現在命名空間的宣告之前:
Example #2 宣告單一命名空間
<html> <?php namespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
另外,與PHP其它的語言特徵不同,同一個命名空間可以定義在多個文件中,即允許將同一個命名空間的內容分割存放在不同的文件中。
定義子命名空間
與目錄和檔案的關係很像,PHP 命名空間也允許指定層次化的命名空間的名稱。因此,命名空間的名字可以使用分層的方式定義:
Example #1 宣告分層的單一命名空間
<?php namespace MyProject\Sub\Level; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
上面的例子創建了常數MyProjectSubLevelCONT_OK,類別 MyProjectSubMyLevelConnection