面向对象 - 自动加载 ¶
作者:KK
发表日期:2017.3.28
autoload何时被运行 ¶
autoload可以用来自动加载没加载过的类
spl_autoload_register(function($className){
echo '引发了' . $className . '的加载';
});
$test = new Test(); // 引发了Test的加载 然后报错
将一个函数作为参数传给spl_autoload_register即可注册你的autoload,然后new一个不存在的类的时候,会自动触发这个函数的运行
系统自动运行autoload的时候这个函数会收到一个参数(就是上面的“$className”),这个参数的值就是被new的那个不存在的类名
加载不存在的类 ¶
autoload在被触发的时候通常要做的一件事,也是它的最终目的:实现加载这个不存在的类
spl_autoload_register(function($className){
include('E:\demo\' . $className . '.php'); //引入这个类对应的文件
return new $className(); //返回实例
});
$test = new Test(); // 引发了Test的加载 然后报错
当然此时要在demo目录下放好一个Test.php,里面定义Test类啦
如果不用autoload
一旦加载很多个类,就会变成这样的代码:
include('E:\demo\A.php'); $a = new A(); include('E:\demo\B.php'); $b = new B(); include('E:\demo\C.php'); $c = new C(); include('E:\demo\D.php'); $d = new D(); include('E:\demo\E.php'); $e = new E();
你看这多少include语句,每new一个类都要先include它是不是很累?实际上一个项目经常要加载的类有30~50个左右,那就要写50次include了喔
所以用autoload就能省事了,现在已经没有熟手会傻傻地一个个include了
关于__autoload
¶
$test = new Test(); // Test 来了来了
function __autoload($className){
echo '引发了' . $className . '的加载';
}
只要定义一个名叫__autoload
函数,当系统发现Test类不存在的时候也会自动触发这个函数,但这个做法是旧版本PHP的自动加载机制
目前还能兼容,可以后就应该不会兼容了,所以不建议使用这个