命名空间
PHP 命名空间(namespace)是在PHP 5.3中加入的,可以解决以下两类问题:
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称创建一个别名(或简短)的名称,提高源代码的可读性。
定义命名空间
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。可以在同一个文件中定义不同的命名空间代码。
如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括** 空白符 **都不能出现在命名空间的声明之前。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php declare(encoding='UTF-8'); namespace MyProject { const CONNECT_OK = 1; class Connection { } function connect() { } }
namespace { // 全局代码 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
|
以下代码会出现语法错误:
1 2 3 4
| <html> <?php namespace MyProject; ?>
|
子命名空间
与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:
1 2 3 4 5 6 7 8
| <?php namespace MyProject\Sub\Level;
const CONNECT_OK = 1; class Connection { } function Connect() { }
?>
|
上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。
别名/导入
PHP 命名空间支持 有两种使用别名或导入方式:为类使用别名、为命名空间使用别名。注意PHP不支持导入函数或常量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php namespace foo; use My\Full\Classname as Another;
use My\Full\NSname;
use \ArrayObject;
$obj = new namespace\Another; $obj = new Another; NSname\subns\func(); $a = new ArrayObject(array(1));
?>
|
后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。
- 类名称总是解析到当前命名空间中的名称。因此在访问不包含在命名空间中的类名称时,必须使用完全限定名称。
- 对于函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
命名空间顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| <?php namespace A; use B\D, C\E as F;
foo();
\foo();
my\foo();
F();
new B();
new D();
new F();
new \B();
new \D();
new \F();
B\foo();
B::foo();
D::foo();
\B\foo();
\B::foo();
A\B::foo();
\A\B::foo(); ?>
|