知优码

您现在的位置是:首页 > Php语言 > php进阶

php进阶

深入理解php命名空间的使用和作用

2020-05-20php进阶
从广义上来说,命名空间是一种封装事物的方法。非限定名称,仅在当前命名空间查询。限定名称,仅在相对于当前命名空间下查找。完全限定名称,仅在指定的命名空间下查找。
从广义上来说,命名空间是一种封装事物的方法。

术语约定:下文中的“类”包括了普通类、抽象类、接口、traits。

一、受命名空间影响的类型

1. 类
2. 函数
3. 常量

变量不受命名空间的影响,定义在A命名空间的全局变量,B命名空间也可以使用。

二、命名空间的类型

1. 非限定名称 Unqualified name
名称中不包含命名空间分隔符的标识符,例如 Foo

2. 限定名称 Qualified name
名称中含有命名空间分隔符的标识符,但不以\开头,例如 Foo\Bar

3. 完全限定名称Fully qualified name
名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。

非限定名称。不包含任何命名空间分隔符,只有类名称。仅在当前命名空间查询。
限定名称。 包含\,但不以\开头的路径为相对路径。即限定名称。仅在相对于当前命名空间下查找。
完全限定名称。以\开头的路径。为绝对路径。仅在指定的命名空间下查找。

MyClass 非限定名称
javaidea\MyClass 限定名称(相对路径)
\javaidea\MyClass 完全限定名称(绝对路径)

三、命名空间的使用

1. 使用use操作符导入命名空间。
2. 使用as为类、函数、常量定义别名。
3. 导入的名称是完全限定解析的,不会根据当前的命名空间作相对解析。

use My\Full\Classname as Another; //为类设置别名

use My\Full\NSname;   //等价于 use My\Full\NSname as NSname 相同

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

use const My\Full\CONSTANT;  //导入常量

四、全局命名空间

如果没有定义任何命名空间,所有的类、函数、常量的定义都属于全局命名空间。

五、访问命名空间的特列

对于非限定名称的函数、常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
只针对非限定名称的函数、常量。(这是出于对旧版本php的兼容,否则所有的内置函数的使用,都得使用完全限定名称了,都得加个\了。)