PHP 5.3 引入命名空間後,use 關鍵字成為管理類別、介面、命名空間別名的核心機制,類似 Unix 系統的符號連結。本文系統解析其三種別名模式、編譯時特性與進階用法。
| 模式 | 語法範例 | 說明 |
|---|---|---|
| 類別別名 | use My\Full\ClassName as Another; | 為類別指定短名稱 |
| 介面別名 | use My\Interface\Name as IName; | 為介面指定短名稱 |
| 命名空間別名 | use My\Long\Namespace as Short; | 為深層命名空間縮短路徑 |
<?php
namespace Foo;
use My\Full\ClassName as Another;
use My\Full\NSName; // 等同 use My\Full\NSName as NSName
use ArrayObject; // 導入全域類別
$obj = new Another(); // 實例化 My\Full\ClassName
$obj = new NSName\Sub\Class(); // 存取 My\Full\NSName\Sub\Class
$a = new ArrayObject([1]); // 實例化全域 ArrayObject
?>
use My\Full\ClassName as Another, My\Full\NSName;
use 在編譯階段解析,不影響動態類別名稱:
use My\Full\ClassName as Another;
$name = 'Another';
$obj = new $name(); // 實例化「Another」類別,而非 My\Full\ClassName
為全域類別建立別名,避免與當前命名空間同名類別衝突:
namespace Foo;
use ArrayObject; // 導入全域 \ArrayObject
// 若無此行,new ArrayObject() 會嘗試實例化 Foo\ArrayObject
use 後必須跟完整命名空間路徑(含分隔符 \),不可省略前導 \(雖可加但不建議)ArrayObject 類別,未 use 導入全域類別會造成衝突use 語法:use My\Lib\{ClassA, ClassB, ClassC as C};use function、use const 導入函數與常數| 錯誤寫法 | 正確寫法 | 原因 |
|---|---|---|
use My\Class; (在 My 命名空間下) | use My\Class as MyClass; | 不可與當前命名空間同名 |
use \Foo\Bar; | use Foo\Bar; | 前導 \ 非必要且不推薦 |
use Foo\Bar as Bar; class Bar {} | 避免別名與當前類別同名 | 命名衝突 |
掌握 use別名機制,能讓命名空間代碼更清晰、維護性更高,是現代 PHP 開發的必備技能。