PHP 5.3 引入命名空間,解決類/函數/常量命名衝突,並提供別名機制簡化長標識符。本文深入講解動態訪問規則、魔術常量、namespace 操作符、別名導入及全局空間調用。
動態調用類、函數、常量時,必須使用 限定名稱 或 完全限定名稱(帶前導反斜槓):
<?php
namespace me\poet;
function test() { echo '1111'; }
$fun = 'test'; // 錯誤:Fatal error: Call to undefined function test()
$fun = '\me\poet\test'; // 正確:完全限定名稱
$fun = 'me\poet\test'; // 正確:限定名稱(相對當前命名空間)
$fun();
關鍵點:動態字符串調用時,不解析 use 導入的別名,必須寫全路徑。
__NAMESPACE__ 與 namespace 操作符<?php
namespace me\poet;
function test() { echo '1'; }
echo __NAMESPACE__; // 輸出:me\poet
// namespace 操作符:顯式訪問當前/子命名空間元素,等價於類中的 self
\me\poet\test(); // 完全限定調用
namespace\test(); // 相對當前命名空間調用,效果相同
<?php
namespace ws\weichen\www;
use ws\weichen\www as poet; // 定義別名 poet
// use ws\weichen\www; // 不加 as,預設取最後一段 www 作為別名
function demo() { echo '1'; }
\ws\weichen\www\demo(); // 完全限定
poet\demo(); // 別名調用
// www\demo(); // 不加 as 時的調用方式
優勢:域名變更時只需修改前綴,業務代碼中別名保持不變。
use \nihao\shijie as hello, \ws\weichen\www;
在命名空間中調用全局函數/類,需加前導反斜槓:
<?php
namespace A\B\C;
function fopen() {
$f = \fopen('demo.txt'); // 調用全局 fopen,而非 A\B\C\fopen
return $f;
}
檢查 PHP 版本:命名空間需 PHP 5.3.0+ 支援。版本過低請升級。
namespace 定義當前代碼所屬「域」use 為長命名空間定義短別名,類似文件系統的軟鏈接new \Zend\Http\PhpEnvironment\Bar()namespace Foo; use \Zend\Http\PhpEnvironment as pe; new \pe\Bar()PHP 命名空間解決兩類問題:
1. 用戶代碼與內部/第三方代碼的命名衝突
2. 為過長標識符創建別名,提升可讀性
提供將相關類、函數、常量組織在一起的途徑。