ModernPHP 命名空间

本文介绍PHP中命名空间的相关使用和概念。

0x00 声明

1
namespace Symfony\Component\HttpFoundation;

这一行代码是PHP命名空间声明语句。声明语句始终应该放在

1
2
3
4
5
6
7
8

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

### 0x01 导入
```php
use Symfony\Component\HttpFoundation\Response;

$r = new Response();

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

1
2
3
use Symfony\Component\HttpFoundation\Response as Res;

$r = new Res();

应该在PHP文件顶部使用use关键字导入代码,而且要放在

1
2
3
4
5
6
7
8

从PHP5.6开始还可以导入函数和常量。导入函数时需要使用use func,导入常量时使用use constant。
```php
use func Namespace\funcName;
use constant Namespace\CONST_NAME;

funcName();
echo CONST_NAME;

0x02 全局命名空间

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

有些代码没有命名空间,这些代码在全局命名空间中,例如PHP原生的Exception类。在命名空间中引入全局命名空间的代码时,需要在类、接口、函数或者常量前加上\符号。例如下面这个例子中,

方法会报错,因为PHP会去搜索当前命名空间下的Exception,也就是会去搜索\My\Space\Foo\Exception类,但是这个类不存在。因此我们需要在Exception类前加上\前缀,表名要去全局命名空间中查找该类。
1
2
3
4
5
6
7
8
9
10
11

一个错误的栗子:
```php
namespace My\Space;
class Foo()
{
public function run()
{
$e = new Exception();
}
}

真确的栗子:

1
2
3
4
5
6
7
8
namespace My\Space;
class Foo()
{
public function run()
{
$e = new \Exception();
}
}

ModernPHP 系列全集:传送门

0%