Yii2与Composer中的autoload

4 篇文章 0 订阅

Yii2中的实现

Yii2中的autoloader是通过spl_autoload_register(['Yii', 'autoload'], true, true);函数实现自动加载,就是将app中要使用的类回调到Yii类中的autoload方法中去.

对于Yii系统中的类,会有映射表(其实说白了就是个数组,叫这个名字显得专业),会更快的查找到.
动态的话需要将命名空间转换为类所在的路径,这就是为什么命名空间类似于这样:app\models\TestModel.
Yii会根据@app别名定位路径,然后models文件夹中的TestModel.php文件.
最后调用include()函数后做判断是否包含了文件,如果没有包含到当中去抛出异常结束运行.

再说一下PHP当中的__autoload方法.

__autoload不是类中的magic方法,可以用于执行程序当中动态查找类.

Composer自动加载

有过框架使用经验的不难看出,对于但入口应用程序来讲在开头会require一个文件:
require '/path/to/vendor/autoload.php';
这样composer会根据命名空间来加载.

对于composer提供了四种方式进行加载:
PSR-4, PSR-0, 生成class-map(与Yii类似,但是观察autoload_classmap.php文件很少有用这个的)和直接包含files的方式.
命名空间跟依赖包中的composer.json文件息息相关,注意事依赖包,不是root的项目包. composer.json文件当中有个autoload字段.

例:

{
    "autoload": {
        "psr-4": {
            "Foo\\": "src/",
        }
    }
}

或者是

{
    "autoload": {
        "psr-0": {
            "Foo\\": "src/",
        }
    }
}

先说psr-4psr-0的两种区别,psr-0的查找路径为src/Foo/文件夹去查找,而psr-4的这种方式会在src/去查找这个类的文件.
最终会写如autoload_namespaces.php文件当中.

使用classmap机制时,会生成MAP形式存储在这个文件里:vendor/composer/autoload_classmap.php.
例:

{
    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }
}

明确指定某些文件,在每次请求时都要包含这些文件,那么也就意味着这是作为一些核心的资源使用这样的方式,注意这样的方式包含过多会影响接口的请求速度,尤其是包含过多且没有使用.浪费加载时间.

这样的加载方式会保存到文件autoload_files当中去,并且全局变量$GLOBALS['__composer_autoload_files'][要加载的类生成的md5字符串]如果包含该文件那么该全局变量的值为true.

{
    "autoload": {
        "files": ["src/MyLibrary/functions.php"]
    }
}

总结如下

Yii2 的加载机制是与composer是一样的都是使用了spl函数.

但是他们的查找方式略有不同.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值