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-4
与psr-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
函数.
但是他们的查找方式略有不同.