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