__autoload魔法函数

5 篇文章 0 订阅
 通常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、如果你的类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值