__autoload,spl_autoload_register与自动加载

__autoload,spl_autoload_register与自动加载

先介绍两个函数

        __autoload()函数尝试加载未定义的类

函数声明是

        void __autoload(string $class)

参数$class是待加载的类名,无返回值

        说明:定义了这个函数之后,如果调用了某一个类,但是这个类文件没有加载进来(require,include),那么就会自动调用__autoload()函数,类名就是函数参数(有时候还会带着命名空间)

        spl_autoload_register()函数:注册给定的函数作为 __autoload 的实现

函数声明是

        bool spl_autoload_register ([ callable$autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

这里只说第一个参数,这个参数是回调函数类型的,也就是会传递一个函数的名字给spl_autoload_register()函数

        说明:该函数触发规则和__autoload函数一样,也是在没有找到将要实例化的类时,被触发。触发时,使用参数里的回调函数处理,回调函数参数为类名。其实和__autoload()一样,只不过,__autoload只能定义一次,而spl_autoload_register可多次使用。

 

两个函数的例子对比

__autoload


spl_autoload_register


PS:spl_autoload_register产生的效果其实就是类似以下代码


区别就在于,__autoload只能定义一次,而spl_autoload_register可多次使用,从而使得自动加载更加方便简洁。


        关于自动加载,其实很多框架都是使用spl_autoload_register与命名空间来实现的,下面的是thinkphp5的自动加载,可以尝试理解

// 自动加载
    public static function autoload($class)
    {
        // 检测命名空间别名
        if (!empty(self::$namespaceAlias)) {
            $namespace = dirname($class);
            if (isset(self::$namespaceAlias[$namespace])) {
                $original = self::$namespaceAlias[$namespace] . '\\' . basename($class);
                if (class_exists($original)) {
                    return class_alias($original, $class, false);
                }
            }
        }

        if ($file = self::findFile($class)) {

            // Win环境严格区分大小写
            if (IS_WIN && pathinfo($file, PATHINFO_FILENAME) != pathinfo(realpath($file), PATHINFO_FILENAME)) {
                return false;
            }

            __include_file($file);
            return true;
        }
    }

该代码位于thinkphp\library\think\Loader.php里,可自行查看





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值