<?php
function __autoload($className) {
require($className.".php");
}
Test t = new Test();//此类在这个文件中未定义,构造对象时会自动调用__autoload函数引入对应的类文件
从这个例子中,我们可以看出autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。
因此,当有大量的类文件要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现lazy loading的效果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。
现在有一个这样的问题,如果在一个大项目中,肯定需要用到很多的类库,而这么多的类库,基本上都是由几个不同的人编写的,其类名和实际的磁盘文件的映射规则不会全都相同的。这时候如果要实现自动加载的话就会很复杂,这样的autoload函数会显得十分臃肿。
此时我们可以选择使用spl_autoload_register函数
function redirect($url) { echo '<script type="text/javascript" language="javascript">window.location.href="'.$url.'";</script>'; } spl_autoload_register('redirect');
上面是一个自动加载重定向函数的方法。函数redirect被加入到spl的栈中,这样在项目的其他地方就能通过不引入改文件的地方调用该函数(但是要引入spl_autoload_register()函数所在的脚本文件)。
注意
__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法
可以通过下面的方法来把 _autoload 方法加入 autoload_functions list
spl_autoload_register( '__autoload' );