[关闭]
@Chiang 2020-01-10T11:42:00.000000Z 字数 1898 阅读 501

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

PHP


  • 允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类 unix 文件系统中可以创建对其它的文件或目录的符号连接。
  • 所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名。PHP 5.6开始允许导入函数或常量或者为它们设置别名。
  • 在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的五种导入方式的例子:
  1. <?php
  2. namespace foo;
  3. use My\Full\Classname as Another;
  4. // 下面的例子与 use My\Full\NSname as NSname 相同
  5. use My\Full\NSname;
  6. // 导入一个全局类
  7. use ArrayObject;
  8. // importing a function (PHP 5.6+)
  9. use function My\Full\functionName;
  10. // aliasing a function (PHP 5.6+)
  11. use function My\Full\functionName as func;
  12. // importing a constant (PHP 5.6+)
  13. use const My\Full\CONSTANT;
  14. $obj = new namespace\Another; // 实例化 foo\Another 对象
  15. $obj = new Another; // 实例化 My\Full\Classname 对象
  16. NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
  17. $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
  18. // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象
  19. func(); // calls function My\Full\functionName
  20. echo CONSTANT; // echoes the value of My\Full\CONSTANT
  21. ?>
  • 注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 Foo\Bar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
  • 为了简化操作,PHP还支持在一行中使用多个use语句
  1. <?php
  2. use My\Full\Classname as Another, My\Full\NSname;
  3. $obj = new Another; // 实例化 My\Full\Classname 对象
  4. NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func
  5. ?>

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

  1. <?php
  2. use My\Full\Classname as Another, My\Full\NSname;
  3. $obj = new Another; // 实例化一个 My\Full\Classname 对象
  4. $a = 'Another';
  5. $obj = new $a; // 实际化一个 Another 对象
  6. ?>

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

  1. <?php
  2. use My\Full\Classname as Another, My\Full\NSname;
  3. $obj = new Another; // instantiates object of class My\Full\Classname
  4. $obj = new \Another; // instantiates object of class Another
  5. $obj = new Another\thing; // instantiates object of class My\Full\Classname\thing
  6. $obj = new \Another\thing; // instantiates object of class Another\thing
  7. ?>

导入的作用域规则

use关键字必须在文件的最外层作用域(全局作用域)或命名空间声明内部声明。这是因为导入是在编译时完成的,而不是在运行时完成的,因此不能对其进行块范围的划分。以下示例将显示非法使用use关键字:

  1. <?php
  2. namespace Languages;
  3. class Greenlandic
  4. {
  5. use Languages\Danish;
  6. ...
  7. }
  8. ?>

注:导入规则是基于每个文件的,这意味着包含的文件将不会继承父文件的导入规则。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注