通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。
autoload至少要做三件事情:
第一件事是根据类名确定类文件名。
第二件事是确定类文件所在的磁盘路径。
第三件事是将类从磁盘文件中加载到系统中。
示例:
<?php
function __autoload($class){
$base_class = array('MySQLDB','BaseModel','ModelFactory','BaseController');
if(in_array($class,$base_class)){
require FRAMEWORK.$class.'class.php'; //加载基础模型类
}
else if((substr($class,-5) == "Model"){ //所需要的类的名字最后5个字符是‘Model’时
require MODEL_PATH.$class.'class.php';
}
else if((substr($class,-10) == "Controller"){ //所需要的类的名字最后10个字符是‘Controller’时
require CTRL_PATH.$class.'class.php';
}
}
$c = !empty($_GET['c']) ? $_GET['c'] : "User"; //将“user”当做默认要使用的控制器
$controller_name = $c.'Controller'; //构建控制器的类名
$ctrl = new $controller_name(); //可变类
$a = !empty($_GET['a']) ? $_GET['a'] : "Index";
$action = $a . "Action";
$ctrl -> $action();
以上例子中,接收了GET参数‘c’以后构建了类名“ $c.'Controller'”,这个类没有被加载,系统返回使用自动加载函数__autoload,查询后符合“(substr($class,-10) == "Controller"”条件,进行加载“require CTRL_PATH.$class.'class.php'”。
1.确定文件名:$class.'class.php'
2.确定磁盘路径:CTRL_PATH.$class.'class.php'。(CTRL_PATH为设定好的路径常量)
3.记载此文件:require CTRL_PATH.$class.'class.php'。
注意:
1、如果类存在继承关系(例如:ClassB extends ClassA),并且ClassA不在ClassB所在目录
利用__autoload魔术函数实例化ClassB的时候就会受到一个致命错误。
解决方法:把所有存在extends关系的类放在同一个文件目录下,或者在实例化一个继承类的时候在文件中手工包含被继承的类;
2、另外一个需要注意的是,类名和类的文件名必须一致,才能更方便的使用魔术函数__autoload;
3、在CLI模式下运行PHP脚本的话这个方法无效;
4、如果你的类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。