首页 > 技术文章 > 先说PHP的命名空间

braveliuever 2016-08-25 22:28 原文

一、概述

就像操作系统中文件目录结构一样,同一个文件不能存放在同一个目录中,但是可以在不同的目录中存放。这种通过目录来区分文件的概念用在程序设计领域,就叫命名空间。
命名空间,从广义上来说是一种封装事物的方法。即通过对外提供统一的命名空间来区分自己,而自己在内部实现的时候,就可以使用一些简化的函数名称和类名。最明显的例子,比如:在没有命名空间机制的时候,两个不同字符串处理函数库A,B中可能都用substring方法,如果直接取名substring方法,程序又同时引用了这两个函数库,php程序就会报错,因为不允许有重名的函数。于是两个函数库在写自己substring方法的时候,不得不重命名为A_substring,B_substring,同理,其他方法名也得要做这种唯一性命名。这当然是极度不方便的。
而低版本的php很遗憾地没有支持命名空间,但是php在进步,自php5.3.0以后,是正式支持命名空间了。
php命名空间提供了将类、函数和常量封装到一起的途径。虽然任意合法的php代码都可以包含在命名空间中,但是只有类、接口、函数和常量受命名空间影响。

二、定义

定义方法 ,使用namespace声明
需要注意:声明命名空间的代码必须放在php代码的第一行,前面不能有任何非php的字符包括空白符。除了declare语句以外。declare语句用于定义源文件编码方式。
namespace myname;
支持指定层次化的命名空间名称,例如
namespace myname\subname;
支持在同一文件中定义多个命名空间
支持在不同文件中定义同一个命名空间,这点不同于其他语言,例如java

三、使用

1.相对路径
一种是只有文件名称
解析为当前命名空间+文件名称
一种是路径\文件名称
解析为当前命名空间+路径\文件名称

2.绝对路径
在路径前加上‘\’绝对路径限定符,则使用绝对路径命名空间

所有引用都可以使用绝对路径,总不会错,使用相对路径只是为了简化代码

四、命名空间和动态语言特征

php命名空间的实现受到其语言自身的动态特征的影响。
在动态访问带有命名空间的元素中,必须使用完全限定名称。但是由于在动态类名称、函数名称或常量名称中,限定名称和完全限定名称,没有区别,所以前导的反斜杠是不必要的。
php的动态语言特性,动态访问元素概念,需要后续研究。

五、namespace关键字和__NAMESPACE__常量

__NAMESPACE__魔术常量,表示当前命名空间名称的字符串。在动态创建名称时很有用。
关键字namespace可用来显示访问当前命名空间或子命名空间中的元素。等价于类中的self操作符。

六、使用use导入和创建别名

php中别名通过操作符use实现。

七、全局命名空间

如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与php引入命名空间概念前一样。在名称前加上前缀\表示该名称时全局空间中的名称。

八、后备全局函数和常量

在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称。
而对于函数和常量来说,如果当前命名空间中不存在该函数或常量,php会退而是用全局空间中的函数或常量。

九、名称解析规则

有一系列的名称解析规则,具体看官网吧


参考资料:
PHP命名空间

推荐阅读