在php5之后已经有了类的自动加载机制,可以定义__autoload函数,在使用到某个未定义的类,执行php会出错,但是在此时php引擎在返回失败之前会去check下是否有定义__autoload去加载需要的类。
但是,今天晚上__autoload()这个函数却折磨了我两个小时,function方法进不去,至今没有找到合理的解释。无奈之下只好用spl_autoload_register();
经过搜索资料,可能是应为我用的smarty版本高,没有拿低版本的试验。下面说一下__autoload的弊端:
一个项目中只能定义一个__autoload,假如说当项目中引用了第三方文件时,刚好第三方文件中也使用__autoload;或者项目成员多的时候,定义了不同的 __autoload; 此时就会出错,因为__autoload函数拥有全局域,php也支不支持函数重载,只能将几个__autoload合并成一个。
于是就有了更加灵活的spl_autoload_register()的自动加载机制,php官方也建议不要使用__autoload而使用spl_autoload_register()。
既然__autoload()方法兼容性这么差,那就果断放弃,使用更好用spl_autoload_register()好了;
let's go!!!
比如我需要自动加载根目录下action目录下的 *Action.class.php 文件,如下:
1、先写一个init.php;如下
<?php
header('Content-type:text/html;charset=utf-8');
define('ROOT_PATH',dirname(__FILE__));
//写一个autoloadHandler方法
function autoloadHandler($_className){
if(substr($_className, -6)=='Action'){
echo $_className; //输出类名
require ROOT_PATH.'/action/'.$_className.'.class.php';
}
}
//将autoloadHandler注册为自动加载
spl_autoload_register('autoloadHandler');
?>
2、然后在需要的地方引入init.php,比如:
<?php
require 'init.php';
new ManageAction();
?>
3、程序执行后结果
Action.class.php被引入
输出ManageAction
OVER