简单使用
命名空间主要解决函数/类冲突的问题。由于PHP中中不允许函数重载,所以我们要使用的到命名空间的。先看一个简单的例子。
<?php namespace A; public function test(){ return "hello"; } namespace B; public function test(){ return 'world'; } echo test();
如果我们不加命名空间,则php就会报错。加了之后,上面的输出结果如下:
这是因为在函数调用时候,会采用就近原则来使用命名空间,所以会调用空间B下的test()函数。如果需要使用A中的test,则需要采用下面的方式。
echo A est();
子空间使用
命名空间采用的是树形结构,根节点为空。如A est()表示访问跟根节点下的A空间下的Test方法。当然,还可以在某个空间下继续定义空间,我们称之为子空间。
<?php namespace A; function test(){ return "hello"; } namespace B; function test(){ return 'world'; } namespace AC; function test(){ return "!"; } echo AC est();
在A空间下有定义了一个C空间,我们想要使用C空间下的test()方法,则test()前面加上空间的绝对路径即可。
注意在定义空间时也应该使用绝对定位,比如想要在C下再定义一个子空间,那么应该是 namespace ACD ,而不是 namespace CD
空间引入
在调用别的空间下的函数时,需要加上绝对路径。如果路径很长则书写代码不方便。为了简化操作,我们可以通过引入空间来调用函数。
<?php namespace A; function test(){ return "hello"; } namespace ACDE; function test(){ return "!"; } namespace B; function test1(){ return 'world'; } function test2(){ return '!!!'; } use ACDE; echo E est();
在代码种定义了一个多级空间ACDE,如果不引入空间的话则需要这样来调用 echo ACDE est() ,当我们引入空间后调用就方便了许多。
如果某个空间下定义了类,还可以直接将该类引入。
<?php namespace A; function test(){ return "hello"; } /** * */ class Person{ static $name = 'ff'; } namespace ACDE; function test(){ return "!"; } namespace B; function test1(){ return 'world'; } function test2(){ return '!!!'; } use ACDE; echo E est(); use APerson; echo Person::$name;
直接将Person类引入,然后访问其静态成员。
公共空间
如果PHP脚本文件中没有定义空间,那么其空间被认为是公共空间。
- 公共空间引入自定义空间
<?php require_once 'custom.php'; function test(){ return 'aa'; } echo A est();
调用custom.php文件中A空间下的test()方法。
- 自定义空间引入公共空间
<?php namespace A; require_once 'test.php'; function test(){ return '!!!'; } echo est();
当前的空间是A空间,这里调用公共空间下的test()方法。
注意:如果要使用namespace,则namspace必须是第一行代码。
define定义的常量不受命名空间的限制