PHP命名空间

从PHP5.3开始,PHP加入namespace关键字,与其他面向对象语言一样,解决了多文件之间的类、常量、函数的命名冲突。

定义

PHP支持两种方式的命名空间书写方式。建议多个命名空间在同一个文件中时,用大括号包裹起来。

<code>//方式一
namespace MyProject;
/**以下为代码*/
const TEST_CONST = 1;
function test(){
}
class TestClass {
}
namespace MyProject1;
const TEST_CONST = 2;
function test1(){
}
class TestClass1 {
}/<code>
<code>//方式二
namespace MyProject {
const TEST_CONST = 1;
function test(){
}
class TestClass {
}
}
namespace OtherProject {
const TEST_CONST = 2;
function test(){
}
class TestClass {
}
}/<code>

在这里要注意的是,一个PHP文件中,如果出现了命名空间那么namespace一定要出现在最前面,也就是第二行,有且仅有declare语句可以出现在它前面(但在开发模式下会提示warning)。例如:

PHP命名空间

子命名空间

为了更好的层次化命名,PHP可以使用子命名空间来定义。

PHP命名空间

命名空间的使用

命名空间的命名用要遵守以下三个方面的规则:

  • 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
  • 限定名称,或包含前缀的名称,例如 $a = new subnamespace\\foo(); 或 subnamespace\\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\\subnamespace\\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\\foo。
  • 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \\currentnamespace\\foo(); 或 \\currentnamespace\\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\\foo。

我们通过例子来了解,在同一文件夹内有两个文件test1.php,test.php。

PHP命名空间

test1.php

PHP命名空间

test.php

PHP命名空间

输出结果

当前目录下的所有文件都是以文件夹为命名空间,文件名为类名时,我可以使用PHP动态创建的优势,自动载入类。

PHP命名空间


分享到:


相關文章: