该系列我只写我的理解,非官方解释,如不够专业请见谅
命名空间存在主要是为了解决同名类同名方法在同一个项目中的冲突问题,虽然用起来比较繁琐但还是不得不用,为了代码整齐易于管理。标准php建议我们命名空间命名与目录一致,不过这里我为了做测试实例就放统一目录
<?php
//test1.php
// 命名空间的分隔符是反斜杠,该声明语句必须在文件第一行。
// 命名空间中可以包含任意代码,但只有 **类, 函数, 常量** 受命名空间影响。
namespace NameA\Test;
// 该类的完整限定名是 \NameA\Test\A , 其中第一个反斜杠表示全局命名空间。
class A{
public function show(){
echo '\NameA\Test\A';
}
}
// 你还可以在文件中定义第二个命名空间,接下来的代码将都位于 \NameB\Test .
namespace NameB\Test;
class B{
public function show(){
echo '\NameB\Test\B';
}
}
<?php
//test2.php
// 你还可以用花括号定义命名空间
namespace NameC\Test{
require_once('test1.php');
// 导入来自其他命名空间的名称,并重命名,
// 注意只能导入类,不能用于函数和常量
use \NameA\Test\A as ClassA;
class C{
public function show(){
// 实例化来自子命名空间的对象:
$b = new \NameB\Test\B;
$b->show();
$a = new ClassA;
$a->show();
}
}
}
<?php
//test3.php
require_once('test2.php');
use \NameC\Test\C as ClassC;
$c = new ClassC;
$c->show();
//输出 \NameB\Test\B\NameA\Test\A
如上例子 展示了同文件中多命名空间、方括号包裹命名空间、use
命名空间与别名定义
值得注意的时候定义命名空间的时候使用NameA\Test
,但引用的时候需要\NameA\Test
,要不在NamaB\Test
命名空间中使用NameA\Test
引用的其实是NamaB\Test\NameA\Test
!
优化
php5.6以后对命名空间有一定的优化可以直接通过命名空间引用常量和函数
<?php
namespace Name\Space {
const FOO = 42;
function f() { echo __FUNCTION__."\n"; }
}
namespace {
//支持对常量的引用
use const Name\Space\FOO;
//支持对函数的引用
use function Name\Space\f;
echo FOO."\n";//42
f();//Name\Space\f
}