首页 > 代码库 > PHP 命名空间(namespace)

PHP 命名空间(namespace)


1 命名空间综述

在C#和Java中都有命名空间的概念,而在PHP中,命名空间在PHP 5.3版本中首次加入的,以前的版本没有这个功能。

1.1 为什么要使用命名空间?

做项目时,一个文件可能会引入多个文件。如果不使用命名空间,引入的多个文件中可能存在同名的类、函数、常量,就会报错(重复定义的错误)。

以函数为例,演示如下:

1.1.1 不使用命名空间:

技术分享

技术分享

技术分享

运行结果:

技术分享

1.1.2 使用命名空间:

只在上述代码中修改b.php文件,如下:

技术分享

再次访问,则不会报错,运行结果:

技术分享

1.2 使用命名空间 优势

简单的说,就是解决代码冲突。具体如下:

  • 使用框架、第三方类库,可以避免的类、函数、常量的冲突。
  • 可以分工协作,有利于多人同时开发一个项目,提高开发效率。

2 定义命名空间

如上1.1.2所示,一旦namespace声明了命名空间,后面的代码都属于该空间。

  • 在定义的命名空间之前不能有任何输出。如html代码等。
  • 在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句,如:declare(encoding=‘UTF-8‘);
  • 项目中,只在一个php文件的开头进行定义命名空间,并且只定义一个。
  • 通常该命名空间要遵循PSR-0命名规范(命名空间和目录结构保持一致)。

3 空间分类

分为两类:全局空间 和 命名空间

3.1 全局空间

不在namespace声明的空间里面的代码都属于全局空间。

3.2 命名空间

如:namespace Think;

如:namespace Think\Controller; 这种反斜线分割的、层次化的,就是子命名空间。

如果需要在命名空间使用全局空间的类、函数、常量,在调用时,需要加上反斜线(代表全局空间)。

4 命名空间的使用

4.1使用限定名称、非限定名称访问

  • 非限定名称:  访问当前命名空间。(在当前文件中直接使用)
  • 限定名称:     类似于相对路径,访问当前空间下的子命名空间,如:new People\Person();
  • 完全限定名称:类似于绝对路径,访问全局空间,如:new \Person();实例化全局空间下的Person类

4.2 导入 命名空间,然后直接使用

语法:use 命名空间,可以起别名(as 别名)。

目的:在当前文件中使用其他命名空间的 类、函数、常量。(使用时,就不用加上限定名称)

PHP 命名空间(namespace)