PHP 5.3 的一個新的重要特性就是命名空間(namespace)。
這項特性在PHP5.0x 時候就提出過,後來被取消並安排在PHP6 中實作。而此次又「提前」到了PHP5.3 發布,可見開發人員對其的重視以及謹慎的態度。
官方發佈時說明文件的內容可能已過期(documentation maybe out dated),所以在這裡簡單的說明命名空間的用法:首先是聲明一個命名空間,加入了新的關鍵字namespace ,其應在類文件的開頭
<?phpnamespace Project::Module;class User {const STATUS_OK = true;function register($data) {...}...}然後在控制器中(可能是其他檔案)就可以這樣呼叫
$user = new Project::Module::User();$user->register($register_info);的確與平常的並無兩樣,但是我們可以將兩個相互獨立的類別連結起來。例如
Project::Module::User;Project::Module::Blog;這樣就能從語言本身更容易描述和理解變數、類別之間的關係,從而避免了「傳統」上的Project_Module_Blog 這樣冗長的命名方式。
上面的說明可能很難說明使用命名空間帶來了什麼好處,新增加的use 和as 關鍵字或許能更好的說明問題。 use 和as 語句可以引用和宣告命名空間的「別名」。例如,上述的控制器中實例化類別的程式碼可以這樣寫
use Project::Module;$user = new Module::User();$user->register($register_info);甚至
use Project::Module:: User as ModuleUser;$user = new ModuleUser;$user->register($register_info);類別中的常數也可以透過命名空間訪問,例如上述類別中的STATUS_OK 就可以透過命名空間
Project::Module::User: :STATUS_OK訪問。進一步的,也可以用別名簡化那麼長的「變數名稱」
use Project::Module::User::STATUS_OK as STATUS_OK;echo STATUS_OK;順便提下「超空間(The Global Namespace)」的概念。所謂的“超空間”,就是沒有指定命名空間的變數、類別和函數。例如
function foo() {...}這的函數,可以使用foo()執行的同時,也可以使用::foo();這樣執行。
最後,配合使用autoload函數即可載入指定命名空間的類別。簡單的函數如下
function __autoload( $classname ) {$classname = strtolower( $classname );$classname = str_replace( '::', DIRECTORY_SEPARATOR, $classname );require_once( dirname( __FILE__ ) $. '/ . '.class.php' );}這樣,例如呼叫
__autoload('Project::Module::User');就可以自動載入Project_Module_User.class.php檔案(雖然這樣看起來並不方便多少)。