原文地址:https://www.sitepoint.com/how-to-use-php-namespaces-part-3-keywords-and-autoloading/
在前两篇文章中,我们看到了命名空间的基础,引入以及别名的使用。在最后的这一篇中,我们来讨论下更进阶的东西。
1.__NAMESPACE__
__NAMESPACE__是用来返回页面命名空间名称的。在全局的情况,他将返回空字符串。
<?php
namespace App\Lib1;
echo __NAMESPACE__; // outputs: App\Lib1
?>
很简单,对吧。这个功能主要用在debug的时候。当然也可以用在动态生成全限定Class名称的时候。比如下面:
<?php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
$c = __NAMESPACE__ . '\\MyClass';
$m = new $c;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>
2.命名空间关键字
命名空间的关键字被用来明确的只出一个项目在一个命名空间,或者子空间。在class中他相当于self。
<?php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
$m = new namespace\MyClass;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>
3.自动加载命名空间里的class
php的一大特色是节约时间。在全局(没有命名空间的时候)的php代码中。一个标准的自动加载function是这样的:
<?php
$obj1 = new MyClass1(); // classes/MyClass1.php is auto-loaded
$obj2 = new MyClass2(); // classes/MyClass2.php is auto-loaded
// autoload function
function __autoload($class_name) {
require_once("classes/$class_name.php");
}
?>
在php 5.3中,你能创建一个关于class的命名空间实例。咋这种情况下,全限制的命名空间和class名称,被传给了__autoload function。比如$class_name的值是"AppLib1MyClass"。如果你替换掉同一目录下的所有class文件的,并且去掉命名空间的部分,那么,这里一定会报冲突的。
换一个思路,把你的class文件层次用命名空间的结构分开整理。就像/classes/App/Lib1这样。
\classes\App\Lib1\MyClass.php
<?php
namespace App\Lib1;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
?>
这个放在class下
myapp.php:
<?php
use App\Lib1\MyClass as MC;
$obj = new MC();
echo $obj->WhoAmI();
// autoload function
function __autoload($class) {
// convert namespace to full file path
$class = 'classes\' . str_replace('\\', '/', $class) . '.php';
require_once($class);
}
?>
说明:
1.App\Lib1\MyClass 被重命名为MC
2.new MC()在编译的时候被转义为new App\Lib1\MyClass()
3.我们这里通过__autoload()加载加载了App\Lib1\MyClass,这里将自动加载所有命名空间的路径。
4.如果不需要__autoload()加载,要手动加载require应该在new之前,而不是在最后,php把autoload提前执行了。