什么是命名空间?
从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。
例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。 具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。 另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。 这个原理应用到程序设计领域就是命名空间的概念。
为什么需要定义命名空间?
主要用来解决在编写类库或者应用程序时创建可重用代码类与函数的两类问题: 1:用户编写的代码与php内部或者第三方的类库,函数,常量的命名冲突 2:为很长的标识符定义一个别名,提高源代码的可读性针对上面的问题举一个例子:
class Memcached{ //...some code }
这里定义一个Memcached类当执行时给出一个致命的错误,Cannot redeclare class Memcached 不能重复声明Memcached,
因为Memcached类已经内置在PHP中,为了使程序更加容易阅读而你又不想使用其它的名称,你就可以使用命名空间,创建这个类。
namespace My_libs;class Memcached{ }
如何定义命名空间
单个命名空间定义实例:
namespace myproject{ const FOO = 1; function foo(){} class foo{}}
另外也可以在一个文件中定义多个命名空间,有两种方式可以定义多个命名空间
1:使用大括号语法 :包含类,常量,函数;
namespace myproject{ const FOO = 1; function foo(){} class foo{}}namespace myproject1{ const BAR = 1; function bar(){} class bar{}}
使用大括号语法需要的注意问题:开始的declare语句外,命名空间的括号外不得有任何PHP代码。
2:使用简单组合语法:
namespace myproject const FOO = 1; function foo(){} class foo{}namespace myproject1 const BAR = 1; function bar(){} class bar{}
虽然可以这样使用命名空间,但官方都不见建议在一个文件中定义多个命名空间