命名空间个最明确的目的就是解决重名问题 PHP中不允许两个函数或类出现相同的名字 否则会产生个致命的错误。这种情况下只要避免命名重复就可以解决 最常见的一种做法是约定个前缀。

例:项目中有两个模块:article和message board 它们各自有个处理用户留言的类Comment。之后我可能想要增加对所有用户留言的一些信息统计功能 如说我想得到所有留言的数量。这时候调用它们Comment提供的方法是很好的做法 但是同时引入各自的Comment类显然是不行的 代码会出错 在另个地方重写任何个Comment也会降低维护性。那这时只能重构类名 我约定了个命名规则 在类名前面加上模块名 像这样:Article_Comment、MessageBoard_Comment

可以看到 名字变得很长 那意味着以后使用Comment的时候会写上更多的代码(至少字符多了)。并且 以后如果要对各个模块增加更多的一些整合功能 或是互相调用 发生重名的时候就需要重构名字。当然在项目开始的时候就注意到这个问题 并规定命名规则就能很好的避免这个问题。另个解决方法可以考虑使用命名空间。

注明:本文提到的常量:PHP5.3开始const关键字可以用在类的外部。const和define都是用来声明常量的(它们的区别不详述) 但是在命名空间里 define的作用是全局的 而const则作用于当前空间。我在文中提到的常量是指使用const声明的常量。

基础

命名空间将代码划分出不同的空间(区域) 每个空间的常量、函数、类(为了偷懒 我下边都将它们称为元素)的名字互不影响 这个有点类似 常常提到的'封装'的概念。

创建个命名空间需要使用namespace关键字 这样:

<?php//创建个名为'Article'的命名空间namespace Article;?>

要注意的是 当前脚本文件的第个命名空间前面不能有任何代码 下面的写法都是错误的:

例一

//在脚本前面写了一些逻辑代码<?php$path = "/";class Comment { }namespace Article;?>

例二