(PHP 5 >= 5.3.0, PHP 7, PHP 8)
允許通過(guò)別名引用或導入外部的完全限定名稱(chēng),是命名空間的一個(gè)重要特征。這有點(diǎn)類(lèi)似于在類(lèi) unix 文件系統中可以創(chuàng )建對其它的文件或目錄的符號連接。
PHP 可以為這些項目導入或設置別名: 常量、函數、類(lèi)、接口、命名空間。
別名是通過(guò)操作符 use
來(lái)實(shí)現的。下面是五種導入方式的例子:
示例 #1 使用 use 操作符導入/使用別名
<?php
namespace foo;
use My\Full\Classname as Another;
// 下面的例子與 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 導入一個(gè)全局類(lèi)
use ArrayObject;
// 導入函數
use function My\Full\functionName;
// 為函數設置別名
use function My\Full\functionName as func;
// 導入常量
use const My\Full\CONSTANT;
$obj = new namespace\Another; // 實(shí)例化 foo\Another 對象
$obj = new Another; // 實(shí)例化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 實(shí)例化 ArrayObject 對象
// 如果不使用 "use \ArrayObject" ,則實(shí)例化一個(gè) foo\ArrayObject 對象
func(); // 調用函數 My\Full\functionName
echo CONSTANT; // 輸出 My\Full\CONSTANT 的值
?>
Foo\Bar
以及相對的不包含命名空間分隔符的全局名稱(chēng)如
FooBar
)來(lái)說(shuō),前導的反斜杠是不必要的也不推薦的,因為導入的名稱(chēng)必須是完全限定的,不會(huì )根據當前的命名空間作相對解析。
為了簡(jiǎn)化操作,PHP 還支持在一行中使用多個(gè) use 語(yǔ)句
示例 #2 通過(guò) use 操作符導入/使用別名,一行中包含多個(gè) use 語(yǔ)句
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實(shí)例化 My\Full\Classname 對象
NSname\subns\func(); // 調用函數 My\Full\NSname\subns\func
?>
導入操作是在編譯執行的,但動(dòng)態(tài)的類(lèi)名稱(chēng)、函數名稱(chēng)或常量名稱(chēng)則不是。
示例 #3 導入和動(dòng)態(tài)名稱(chēng)
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // 實(shí)例化一個(gè) My\Full\Classname 對象
$a = 'Another';
$obj = new $a; // 實(shí)際化一個(gè) Another 對象
?>
另外,導入操作只影響非限定名稱(chēng)和限定名稱(chēng)。完全限定名稱(chēng)由于是確定的,故不受導入的影響。
示例 #4 導入和完全限定名稱(chēng)
<?php
use My\Full\Classname as Another, My\Full\NSname;
$obj = new Another; // class My\Full\Classname 的實(shí)例對象
$obj = new \Another; // class Another 的實(shí)例對象
$obj = new Another\thing; // class My\Full\Classname\thing 的實(shí)例對象
$obj = new \Another\thing; // class Another\thing 的實(shí)例對象
?>
use
關(guān)鍵詞必須在文件最外層范圍
(全局作用域)或在命名空間聲明內。
由于導入發(fā)生在編譯時(shí),而不是運行時(shí),所以不能放入塊作用域。
以下例子展示了不合規則的 use
關(guān)鍵詞使用示例:
示例 #5 不合規的導入規則
<?php
namespace Languages;
function toGreenlandic()
{
use Languages\Danish;
// ...
}
?>
注意:
導入規則獨立于每個(gè)文件,意味著(zhù)包含的文件 不會(huì )繼承父文件的導入規則。
use
聲明編組
通過(guò)單個(gè) use
語(yǔ)句,可以將來(lái)自同一個(gè) namespace
的
類(lèi)、函數、常量一起編組導入。
<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// 等同于以下編組的 use 聲明
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};