一、简介
PHP允许通过别名引用或导入外部的完全限定名称,这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。可以帮助我们避免在代码中使用冗长的全名,从而提高代码的可读性和可维护性。别名是通过操作符 use 来实现的,本教程将介绍五种导入方式的例子。
PHP 可以为这些项目导入或设置别名:
- 常量
- 函数
- 类
- 接口
- trait
- 枚举
- 命名空间
别名是通过操作符 use 来实现的,下面是五种导入方式的例子。
二、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 语句。通过 use 操作符导入/使用别名,一行中包含多个 use 语句:
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func ?>
导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
三、导入和动态名称
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化一个 My\Full\Classname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?>
另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
四、导入和完全限定名称
<?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 关键词必须在文件最外层范围 (全局作用域)或在命名空间声明内。 由于导入发生在编译时,而不是运行时,所以不能放入块作用域。 以下例子展示了不合规则的 use 关键词使用示例:
1、不合规的导入规则
<?php namespace Languages; function toGreenlandic() { use Languages\Danish; // ... } ?>
注意:导入规则独立于每个文件,意味着包含的文件 不会继承父文件的导入规则。
2、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\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};