1.命名空间声明
命名空间通过关键字 namespace
来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare
关键字。
只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和 trait)、接口、常量和函数。
<?php
//无层次结构的命名空间
namespace MyProject;
/* ... */
?>
<?php
//带层次结构的命名空间
namespace MyProject\Sub\Level;
/* ... */
?>
2.导入外部元素
可以使用 use
、use const
、use function
运算符导入 外部命名空间、类、接口、trait、枚举、常量、函数 这些外部元素到当前命名空间,但并不是成为当前命名空间的成员。
use
导入的名称必须是完全限定的,前导的反斜杠是不必要的也不推荐的,不会根据当前的命名空间做相对解析。
<?php
namespace foo;
// 下面的例子与 use My\Full\NSname as NSname 相同
use My\Full\NSname;
// 导入类并别名
use My\Full\Classname as Another;
// 导入一个全局类
use ArrayObject;
// 导入常量
use const My\Full\CONSTANT;
// 导入函数
use function My\Full\functionName;
// 导入函数并别名
use function My\Full\functionName as func;
3.名称解析规则
名称 | 描述 | 解析规则 |
完全限定名称(Fully qualified name) | 名称中包含命名空间分隔符(\ ),并以命名空间分隔符(\ )开始的标识符,例如 \Foo\Bar 。namespace\Foo 也是一个完全限定名称。 | 完全限定名称总是会解析成原样,例如 \my\name 解析为 my\name ,\Exception 解析为 Exception 。 |
限定名称(Qualified name) | 名称中包含命名空间分隔符(\ ),但不以命名空间分隔符(\ )开始的标识符,例如 Foo\Bar 。 | 限定名称的解析次序为: 导入->当前命名空间。 |
非限定名称(Unqualified name) | 名称中不包含命名空间分隔符(\ )的标识符,例如 Foo 。 | 非限定名称的解析次序为: 如果是类,导入->当前命名空间。 如果是常量和函数,导入->当前命名空间->全局空间。 |
相对名称(Relative name) | 名称以 namespace 关键字或 __NAMESPACE__ 魔术变量开头的标识符, 例如 namespace\Foo\Bar 、__NAMESPACE__ . '\MYCONST' 。 | 指向 namespace 关键字和 __NAMESPACE__ 常量所在的命名空间。如果为全局,则去掉 namespace\ 开头,__NAMESPACE__ 为空。 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/4956.html