php命名空间
[PHP命名空间的作用、为什么使用命名空间?]
- 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。
在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的。可以将 PHP 命名空间与文件系统作一个简单的类比。在文件系统中访问一个文件有三种方式:
- 相对文件名形式如foo.txt。它会被解析为
currentdirectory/foo.txt
,其中 currentdirectory 表示当前目录。因此如果当前目录是/home/foo
,则该文件名被解析为/home/foo/foo.txt
。
- 相对文件名形式如foo.txt。它会被解析为
- 相对路径名形式如
subdirectory/foo.txt
。它会被解析为currentdirectory/subdirectory/foo.txt
。
- 相对路径名形式如
- 绝对路径名形式如
/main/foo.txt
。它会被解析为/main/foo.txt
。
- 绝对路径名形式如
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
。
- 完全限定名称,或包含了全局前缀操作符的名称,例如,
举个列子
比如我有两个test class 需要在同一个php中引用
<?php
namespace test1;
class test{
public function todo(){};
}
<?php
namespace test2;
class test{
public function todo(){};
}
这样加了命名空间 namespace test1;
namespace test2;
就不会冲突了,我们就可以在同一个php中引用了
<?php
require "test/test1.php";
require "test/test2.php"
$test1 = new test1\test();
$test2= new test2\test();