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 别名)。
目的:在当前文件中使用其他命名空间的 类、函数、常量。(使用时,就不用加上限定名称)