1.命名空间声明
命名空间声明必须在文件中的顶部,在命名空间声明之前不可以有 PHP 代码、非 PHP 代码(例如:HTML、空白符等),除了declare
语言结构的 encoding
指令。
尽管任何有效的 PHP 代码都可以包含在命名空间体中,但受命名空间影响的只有这些元素:类(包括抽象类)、接口、trait
、常量、函数。
此外,同一个命名空间可以在多个文件中声明,从而允许跨文件拆分命名空间中的元素。
注意:命名空间声明不支持嵌套命名空间声明,可以使用声明方式一中的有类似于目录的层次结构模拟嵌套命名空间声明。
1.1声明方式一
//无类似于目录的层次结构
namespace 命名空间名;
//命名空间体
//有类似于目录的层次结构
namespace MyProject\Sub\Level;
//命名空间体
1.2声明方式二
//同一个文件只有一个命名空间
namespace 命名空间名 {
//命名空间体
}
//同一个文件有两个命名空间
namespace 命名空间名1 {
//命名空间体
}
namespace 命名空间2 {
//命名空间体
}
//同一个文件有一个命名空间和一个全局非命名空间(namespace关键字后无命名空间名称)
//注意:两个命名空间无先后顺序。
namespace 命名空间名1 {
//命名空间体
}
namespace {
//全局代码
}
2.use导入外部的元素到命名空间
可以使用 use
导入外部的命名空间、类、接口、trait
、枚举、常量、函数等元素到命名空间。
可以使用 as
为导入的元素添加别名。
use
必须在文件的 最外层作用域(全局作用域) 或 命名空间声明中。
注意:use
后的名称必须是完全限定名称,因此可以省略开头的命名空间分隔符(\
)。
//导入一个
//导入命名空间
//等同于use My\Full\NSname as NSname;
use My\Full\NSname;
//导入类
use ArrayObject;
use My\Full\Classname as Another;
//导入常量
use const My\Full\CONSTANT;
//导入函数
use function My\Full\functionName;
use function My\Full\functionName as func;
//导入非同一个命名空间的多个
use My\Full\Classname as Another, My\Full\NSname;
//导入同一个命名空间的多个
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 some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
3.元素名称解析规则
__NAMESPACE__
魔术常量 和 namespace
关键字 指向其所在的当前命名空间,类似于类的 __CLASS__
魔术常量 和 self
关键字。
注意:可变变量名、可变函数名、可变类名的表达式内的名称必须是完全限定名称,因此可以省略开头的命名空间分隔符(\
)。
元素名称 | 元素解析规则 |
完全限定名称(Fully qualified name):名称中包含命名空间分隔符(\ ),并以命名空间分隔符(\ )开头,例如:\Foo\Bar 。 | 类似于文件目录系统的绝对路径。\ 类似于文件目录系统“根”目录,所以可称为“根”命名空间。 |
限定名称(Qualified name):名称中包含命名空间分隔符(\ ),但不以命名空间分隔符(\ )开头,例如:Foo\Bar 。 | use导入的元素->当前命名空间中的元素。 |
非限定名称(Unqualified name):名称中不包含命名空间分隔符(\ ),例如:Foo 。 | 如果是类,use导入的类->当前命名空间中的类。 如果是常量和函数,use导入的常量和函数->当前命名空间中的常量和函数->全局命名空间中的常量和函数。 |
相对名称(Relative name):名称以 namespace 关键字开头, 例如:namespace\Foo\Bar 。 | 类似于文件目录系统的相对路径。namespace 关键字指向其所在的当前命名空间。 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/php/phplang/28885.html