使用命名空間:別名/導(dǎo)入

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

允許通過別名引用或?qū)胪獠康耐耆薅Q,是命名空間的一個(gè)重要特征。這有點(diǎn)類似于在類 unix 文件系統(tǒng)中可以創(chuàng)建對(duì)其它的文件或目錄的符號(hào)連接。

PHP 可以為這些項(xiàng)目導(dǎo)入或設(shè)置別名: 常量、函數(shù)、類、接口、命名空間。

別名是通過操作符 use 來實(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 的值
?>
注意對(duì)命名空間中的名稱(包含命名空間分隔符的完全限定名稱如 Foo\Bar 以及相對(duì)的不包含命名空間分隔符的全局名稱如 FooBar)來說,前導(dǎo)的反斜杠是不必要的也不推薦的,因?yàn)閷?dǎo)入的名稱必須是完全限定的,不會(huì)根據(jù)當(dāng)前的命名空間作相對(duì)解析。

為了簡(jiǎn)化操作,PHP 還支持在一行中使用多個(gè) use 語(yǔ)句

示例 #2 通過 use 操作符導(dǎo)入/使用別名,一行中包含多個(gè) use 語(yǔ)句

<?php
use My\Full\Classname as AnotherMy\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 AnotherMy\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 AnotherMy\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ì)象
?>

導(dǎo)入規(guī)則的范圍

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 聲明編組

通過單個(gè) use 語(yǔ)句,可以將來自同一個(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\{ClassAClassBClassC as C};
use function 
some\namespace\{fn_afn_bfn_c};
use const 
some\namespace\{ConstAConstBConstC};