续上篇:
如果你是创建有很少依赖的小项目,类名冲突可能不会有太大问题。但如果你是在一个用大量第三方依赖的大项目团队时,类名冲入就是一个值得关注的大问题了。你不能控制被你项目插件引入到全局命名空间的类、接口、函数或常量。这就是为什么对你的代码使用命名空间是重要的。
声明
每一个类、接口、函数或常量都被写在一个命名空间(或子命名空间)下面。命名空间被声明在php文件头部紧挨php头标签的下一行。原文:'Namespaces are declared at the top of a PHP file on a new line immediately after the opening <?php tag.';。命名空间声明以‘namespace’开始,接着是空字符,接着是空间名字,接着是一个分号结束符。
记住,命名空间总是被用来建立一个*的供应商名字(这个翻译不太准确)。下面是一个命名空间声明的例子:
<?php
namespace Oreilly;
所有的php类、接口、函数或常量在这个命名空间声明下面被声明,在某种程度上,是和O’Reilly媒介关联的。如果我们想要组织代码来关联这本书该怎样做?我们使用子命名空间。
子命名空间声明和上一个例子几乎完全一样。这个唯一的不同之处在于我们用'\'符号分离了命名空间和子命名空间。下面这个例子声明了一个叫做ModernPHP的自命名空间在Oreilly命名空间的下面:
<?php
namespace Oreilly\ModernPHP;
所有的php类、接口、函数或常量在这个命名空间声明下面被声明,在某种程度上,是和这本书关联的。
所有的类不必在同一个php文件声明同一个命名空间或子空间。你只要确认命名空间或子空间在任何一个php文件的顶部,你的
代码就会成为这个空间或子空间的一部分。这样就可以使得在分离的文件中写多个类而从属于公共的命名空间成为可能。
最重要的是提供者的命名空间。这是最*的确认你的品牌或组织的命名空间,他必须是全局唯一的。子空间是次要的,但是
它对组织你的项目代码很有帮助。
导入和别名
在我们有命名空间之前,php开发者用Zend-style类名解决名字冲突问题。它是一种被zend框架推广的php类名用下划线代替文件系统目录
分隔的推广命名方案。这个特性做到了两点:它确保了类名的唯一性,它激活了自动加载机制,用文件系统目录的分布来带起类名去检测类文件路径。
举个例子,这个php类Zend_Cloud_DocumentService_Adapter_WindowsAzure_Query对应php文件Zend/Cloud/DocumentService/Adapter/
WindowsAzure/Query.php.一个坏影响就是Zend-style命名方式是一个荒谬的长类名命名型。你可以说我懒,但是我不想多次敲同样类名。
现代PHP命名空间也有类似的问题。例如:这个全响应类名在symfony\httpfoundation组件中是\Symfony\Component\HttpFoundation\Response.
幸运的是,php让我们可以导入和重命名空间代码。
通过导入,我可以清楚我将用哪个命名空间,类,接口,函数,常量在每个php文件中。我可以用这些不用敲全部代码。
通过别名,我可以清楚我将引入一个引入类,接口,函数或常量用很短的名字。
你可以导入和别名的PHP类,接口,和其他的命名空间在PHP 5.3。你可以导入和别名的PHP函数和常数为PHP 5.6。