ModernPHP 命名空间

ModernPHP系列文章 - 命名空间的意义,以及在PHP中如何使用命名空间。

声明

namespace Symfony\Component\HttpFoundation;

这一行代码是PHP命名空间声明语句。声明语句始终应该放在<?php标签后的第一行。命名空间的作用是封装和组织相关的PHP类,就像在文件系统中把相关的文件放在同一个目录中一样。

PHP命名空间与操作系统的物理文件系统不同,这是一个虚拟的概念,没必要和文件系统的目录结构完全对应。但是,大多数的PHP组件为了兼容广泛使用的PSR-4自动加载器标准,会把子命名空间放到文件系统的子目录下。

导入

use Symfony\Component\HttpFoundation\Response;
 
$r = new Response();

当然,你还可以用别名的方式导入:

use Symfony\Component\HttpFoundation\Response as Res;
 
$r = new Res();

应该在PHP文件顶部使用use关键字导入代码,而且要放在<?php标签或命名空间声明语句之后。use关键字必须出现在全局作用域中(即不能出现在类或函数中),因为这个关键字在编译时使用。

从PHP5.6开始还可以导入函数和常量。导入函数时需要使用use func,导入常量时使用use constant。

use func Namespace\funcName;
use constant Namespace\CONST_NAME;
 
funcName();
echo CONST_NAME;

全局命名空间

如果需要在命名空间中引用其他命名空间的类、接口、函数或常量,必须使用完全限定的PHP类名(命名空间+类名),或者使用use关键字提前导入至当前命名空间。

有些代码没有命名空间,这些代码在全局命名空间中,例如PHP原生的Exception类。在命名空间中引入全局命名空间的代码时,需要在类、接口、函数或者常量前加上\符号。例如下面这个例子中,\My\Space\Foo\run() 方法会报错,因为PHP会去搜索当前命名空间下的Exception,也就是会去搜索\My\Space\Foo\Exception类,但是这个类不存在。因此我们需要在Exception类前加上\前缀,表名要去全局命名空间中查找该类。

一个错误的栗子:

namespace My\Space;
class Foo()
{
    public function run()
    {
        $e = new Exception();
    }
}

真确的栗子:

namespace My\Space;
class Foo()
{
    public function run()
    {
        $e = new \Exception();
    }
}

ModernPHP 系列全集:传送门