__autoload()和spl_autoload_register()的理解

了解两个函数__autoload()和spl_autoload_register()
这两个函数的作用都是'自动加载',那么什么是自动加载呢?就是就是我们在
new一个class的时候,不需要手动去写require来导入这个class.php文件,
程序自动帮我们加载导入进来,这就是自动加载,那么这两个函数有什么区别呢
__autoload():因为php是不允许函数重名的所以说这个方法只能定义一次,
这就显得这个函数有点鸡助了,因此就有另一个函数的产生spl_autoload_register($className)
这个函数就可以弥补__autoload()的不足之处了,怎么说呢这个函数的确很强大
当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,
这个函数通过它的参数($className)传进去比如说:
sql_autoload_resister('load_function'); //函数名
sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法
sql_autoload_resister('load_object::load_function'); //类和方法的静态调用


//php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
    if (is_file('./lib/' . $className . '.php')) {
        require './lib/' . $className . '.php';
    }
});


它会把参数自动填入到我们要找的路径中这样让我们轻松了很多,当然这个函数的参数
可以有多种形式的的!
我们还可以用类的加载方式但是要注意了必须是'static'的方法


class autoloading{
    //必须是静态方法,不然报错
    public static function load($className)
    {   
        require $className . '.php';
    }
}
//2种方法都可以
spl_autoload_register(array('autoloading','load')); 
spl_autoload_register('autoloading::load');
$db = new DB(); //会自动找到


当然我们也要注意一下了:如果你同时使用spl_autoload_register和__autoload,__autoload会失效
说了这么半天了那么主题也该说到了__autoload只能定义一次那么让我们看看spl_autoload_register
是怎样定义多次的
function load1($className)
{
    echo 1;
    if (is_file($className . '.php')) {
        require $className . '.php';
    }
}
function load2($className)
{
    echo 2;
    if (is_file('./app/' . $className . '.php')) {
        require './app/' . $className . '.php';
    }
}
function __autoload($className)
{
    echo 3;
    if (is_file('./lib/' . $className . '.php')) {
        require './lib/' . $className . '.php';
    }
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload'); 
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php




我们注册了3个自动加载函数。执行结果是啥呢?


1Hello DB
123Hello Info


当然这个结果是怎么来的的让我们分析一下
new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello
new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,
还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info
注意:spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值