使用命名空间:别名/导入

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

允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。

PHP 可以为这些项目导入或设置别名: 常量、函数、类、接口、命名空间。

别名是通过操作符 use 来实现的。下面是五种导入方式的例子:

示例 #1 使用 use 操作符导入/使用别名

<?php
namespace foo;
use 
My\Full\Classname as Another;

// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;

// 导入一个全局类
use ArrayObject;

// 导入函数
use function My\Full\functionName;

// 为函数设置别名
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(); // 调用函数 My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
func(); // 调用函数 My\Full\functionName
echo CONSTANT// 输出 My\Full\CONSTANT 的值
?>
注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar 以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。

为了简化操作,PHP 还支持在一行中使用多个 use 语句

示例 #2 通过 use 操作符导入/使用别名,一行中包含多个 use 语句

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// 实例化 My\Full\Classname 对象
NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
?>

导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。

示例 #3 导入和动态名称

<?php
use My\Full\Classname as AnotherMy\Full\NSname;

$obj = new Another// 实例化一个 My\Full\Classname 对象
$a 'Another';
$obj = new $a;      // 实际化一个 Another 对象
?>

另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。

示例 #4 导入和完全限定名称

<?php
use My\Full\Classname as AnotherMy\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 关键词必须在文件最外层范围 (全局作用域)或在命名空间声明内。 由于导入发生在编译时,而不是运行时,所以不能放入块作用域。 以下例子展示了不合规则的 use 关键词使用示例:

示例 #5 不合规的导入规则

<?php
namespace Languages;

function 
toGreenlandic()
{
    use 
Languages\Danish;

    
// ...
}
?>

注意:

导入规则独立于每个文件,意味着包含的文件 不会继承父文件的导入规则。

use 声明编组

通过单个 use 语句,可以将来自同一个 namespace 的 类、函数、常量一起编组导入。

<?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};