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