PHP的命名空间是在5.3.0时引入的,用来按照虚拟目录结构组织PHP的代码。
为什么使用命名空间
总结:为了避免命名空间冲突的问题!
作为开发者,除非你开发的是一个小项目,几乎不使用其他第三方的依赖,并且你的代码也不会被其他人使用,不然都可能会遇到命名冲突的问题:不管是类名、借口、函数和常量。
所以使用自己的命名空间,将自己的代码放到唯一的空间之内,这样其他人定义了同样的类名等,但由于声明在不同的空间之内,可以进行有效的区分,完全不会造成冲突,进而引发各种错误。
在PHP引入命名空间之前,因为Zend框架而流行的命名方式:Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query。这样的类名,使用_下划线来作为目录的分隔符,这样可以保证类名的唯一,并且自动加载器会将类名解析为类文件的目录,正确的加载类。但它有一个缺点:类名太长了,尤其是目录结构越来越深时,输入这样的类简直是受罪。
命名空间使用
声明命名空间就是在代码文件<?php之后使用namespace关键字,在之后加上命名空间的名字,如:namespace Zend;
上面只是声明了一层的命名空间,还可以使用\声明多级的命名空间,如:namespace Zend\Cloud;
这样就可以有组织的将不同的类放到不同的文件中。
要做代码中使用这些类,要做的只是就是将这个类的命名空间在代码中引入:
use Zend\Cloud\ClassName as Cname;
在上面的代码中,使用use语句将指定类的命名空间引入,同时使用了as关键字定义了类的别名,这样在类名很长时可以定义简短的类名。
可以使用一个use关键字,后台跟随要引入的所有类:
<?php
use Zend\Cloud\Class1, Zend\Cloud\Class2;
但是这样不易读,推荐每一个use只引入一个类:
<?php
use Zend\Cloud\Class1;
use Zend\Cloud\Class2;
在PHP5.6之后,代码中不只是可以引入类,还可以引入常量和函数:
<?php
use function Zend\Cloud\functionName as func;
use const Zend\Cloud\CONSTANT;
在PHP7.0之后又加入了分组引入,可以将一个命名空间内的方法,类,常量有选择的进行引入,减少了输入:
use some\namespace{ClassA, ClassB, ClassC as C};
use function some\namespace{fn_a, fn_b, fn_c};
use const some\namespace{ConstA, ConstB, ConstC};
其他
1、一个文件多个命名空间
可以在一个文件中定义多个命名空间,但是这样就违背了“一个文件一个类”的良好实践,并且命名空间的使用也会让人疑惑。
2、全局命名空间
全局命名空间,也即是PHP默认的命名空间,PHP自带的那些方法和类都在全局命名空间中,要使用全局的命名空间,在命名空间前面加上\。
3、自动加载
在PHP中定义了spl_autoload_register和spl_autoload_unregister用来注册和取消注册类的自动加载方法,方便类的加载使用。
网友评论