命名空间用来解决两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。
专业词解释
命名空间名称定义
非限定名称Unqualified name 名称中不包含命名空间分隔符的标识符,例如 Foo
限定名称Qualified name 名称中含有命名空间分隔符的标识符,例如 Foo\Bar
完全限定名称Fully qualified name 名称中包含命名空间分隔符,并以命名空间分隔符开始的标识符,例如 \Foo\Bar。 namespace\Foo 也是一个完全限定名称。
可以将 PHP命名空间与文件系统作一个简单的类比。
在文件系统中访问一个文件有三种方式:相对文件名形式如foo.txt。它会被解析为currentdirectory/foo.txt,其中 currentdirectory 表示当前目录。
因此如果当前目录是/home/foo,则该文件名被解析为/home/foo/foo.txt。
相对路径名形式如subdirectory/foo.txt。它会被解析为currentdirectory/subdirectory/foo.txt。
绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。
个人理解:
将命名空间完全等价为linux系统的文件路径
你当前命名空间是space.那么就相当于你在目录space下进行操作,你要使用这个空间下的如果space\test 的方法 fun(), 那么就是test\fun();系统会自动完善为space\test\func();
所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前:
![](https://img.haomeiwen.com/i11005865/b5e055f6495170d9.png)
![](https://img.haomeiwen.com/i11005865/e7125c8e50e272f4.png)
定义子命名空间
与目录和文件的关系很象,PHP命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:eg : namespace MyProject\Sub\Level;
在同一个文件中定义多个命名空间(不推荐使用)
![](https://img.haomeiwen.com/i11005865/e50d50de4b25d4b6.png)
![](https://img.haomeiwen.com/i11005865/68a46ac1e20c1221.png)
命名空间和动态语言特征
![](https://img.haomeiwen.com/i11005865/93ed7f5dbe74dac9.png)
![](https://img.haomeiwen.com/i11005865/21721907bfae7ff2.png)
__NAMESPACE__常量
可以获得当前的命名空间名称
![](https://img.haomeiwen.com/i11005865/91417182be3ba7b8.png)
使用命名空间:别名/导入
![](https://img.haomeiwen.com/i11005865/8bef237333198e28.png)
注意对命名空间中的名称,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
为了简化操作,PHP还支持在一行中使用多个use语句
全局空间
![](https://img.haomeiwen.com/i11005865/50d902daed4a8bfd.png)
使用命名空间:后备全局函数/常量
![](https://img.haomeiwen.com/i11005865/5b817d3a199df713.png)
对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP会退而使用全局空间中的函数或常量.
对于类则会直接报错如果你调用的是类.如果没有找到则会报错.不会去使用全局空间中的类
参考:
网友评论