__autoload
首先,这个方法与__call
,__set
等不一致,他不属于类,但是跟类有关。因为他会在类调用不到时自动调用。
首先,前面我们知道,调用另一个类要么与调用处在一个文件内部,要么就要使用require
,include
等函数,但是当你调用一个类,但是这个类没有进行上述操作时,__autoload
就会自动执行。看下面的demon:
文件结构:
- Controller:文件夹
- IndexController.php
- autoload.php
- index.php
首先来看autoload.php
:
function __autoload($className){
// 将命名空间中的 \ 替换成系统文件路径的 /,\\则是因为\代表转义,所以单纯需要一个\的文本就需要转义一次
$newClassName=str_replace("\\","/",$className);
// 调用对应的文件
include_once "./$newClassName.php";
}
很简单,这里就是定义了__autoload
。
接着简单看一下IndexController.php
:
namespace Controller;
class IndexController{
public function output(){
print "Hello World\n";
}
}
可以看到这里定义了一个命名空间namespace Controller;
接着看重头戏index.php
:
require_once "./autoload.php";
use Controller\IndexController;
$index=new IndexController();
$index->output();
可以看到在运行的系统中:
-
首先需要调用
__autoload
,即我们上面定义的autoload.php
。 -
接着就只要关心命名空间的问题了。因为我们这里并没有显式调用
IndexController.php
,__autoload
帮我们调用了。在
index.php
中当我们尝试实例化IndexController.php
中时,系统并没有找到该类,因为原先没有调用该类,接着编译器尝试寻找__autoload
方法,找到了,接着运行该方法,在方法中我们include_once
了IndexController.php
。所以系统正常运行。