PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。语法格式如下;
bd55b8543326129dc140f453a88c3e81
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
2e40b80a0b1ecedc5ff50f80109dfe22
以下代码会出现语法错误:
100db36a723c770d327fc0aef2ce13b1 <?<span style="color: #000000;">php namespace MyProject; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 命名空间前出现了“100db36a723c770d327fc0aef2ce13b1” 会致命错误 - 命名空间必须是程序脚本的第一条语句</span> ?>
与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
aa3a494f6e6c43abb47690ee86a411d0
<span class="pun"> </span>
上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。
PHP 命名空间中的类名可以通过三种方式引用:
下面是一个使用这三种方式的实例:
file1.php 文件代码
e45b18311036e47cadca18d48baeb49a
<span class="pun"> </span>
file2.php 文件代码
4d4b246d0b2e645a18d3272354b27470
<span class="pun"> </span>
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
在命名空间内部访问全局类、函数和常量:
a117f334607af7437f381592c87b7961
<span class="pun"> </span>
PHP 命名空间的实现受到其语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。
example1.php 文件代码:
ebb68e06faa2d5267183bc8613f994c3
<span class="pun"> </span>
必须使用完全限定名称(包括命名空间前缀的类名称)。注意因为在动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,因此其前导的反斜杠是不必要的。
动态访问命名空间的元素
36621a6501f148bb688834705e031e78
<span class="pun"> </span>
PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。
__NAMESPACE__ 示例, 在命名空间中的代码
0259d21562973a060a81bf0cec662474
<span class="pun"> </span>
__NAMESPACE__ 示例,全局代码
dadebdc49bba0a0651237ef76b4433e9
<span class="pun"> </span>
常量 __NAMESPACE__ 在动态创建名称时很有用,例如:
使用__NAMESPACE__动态创建名称
e8f8638d132fc631d8dfe66495b82eb0
<span class="pun"> </span>
关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
namespace操作符,命名空间中的代码
a00f2e945ab97f0a60b1eb45a5c89341
<span class="pun"> </span>
namespace操作符, 全局代码
72124b90c7057a959bf4a4583ec6785a
<span class="pun"> </span>
PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量。
在PHP中,别名是通过操作符 use 来实现的. 下面是一个使用所有可能的三种导入方式的例子:
1、使用use操作符导入/使用别名
a01acbae0eba04fa7c9aa70ea601be42
<span class="pun"> </span>
2、 一行中包含多个use语句
2bacf08d504e0d58c107613659765f38
<span class="pun"> </span>
导入操作是在编译执行的,但动态的类名称、函数名称或常量名称则不是。
3、导入和动态名称
fac81042c56ad30bc4478243551e9d0c
另外,导入操作只影响非限定名称和限定名称。完全限定名称由于是确定的,故不受导入的影响。
4、导入和完全限定名称
137b5954c3299c49d8d3a74640e02bf7
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,例如:
1、在命名空间中访问全局类
cba570f79edf518d513ebb3cc1ac7d2d
<span class="pun"> </span>
对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
2、 命名空间中后备的全局函数/常量
c290cbb5250f34d2ee8129af1553a925
<span class="pun"> </span>
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
使用全局空间说明
03e2106b7f407313e0a8979eeb45647b
<span class="pun"> </span>
自从有了命名空间之后,最容易出错的该是使用类的时候,这个类的寻找路径是什么样的了。
<span style="color: #008080;"> 1</span> 7bdbfa27cb07b4e40821229fb8a9167d
<span class="pun"> </span>
名称解析遵循下列规则: