YII框架的类自动加载机制
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。
QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现。
先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法
public static function autoload($className)
{
if (isset(static::$classMap[$className])) { //先去类地图里面找
$classFile = static::$classMap[$className];
if ($classFile[0] === '@') {
$classFile = static::getAlias($classFile);
}
} elseif (strpos($className, '\\') !== false) { //然后再通过别名计算得到类文件地址
$classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false);
if ($classFile === false || !is_file($classFile)) {
return;
}
} else {
return;
}
include($classFile);
if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {
throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");
}
}
类地图文件:vendor\yiisoft\yii2\classes.php 它会在 vendor\yiisoft\yii2\Yii.php 文件中载入进来。
下面再看,别名方法。
public static function getAlias($alias, $throwException = true)
{
if (strncmp($alias, '@', 1)) {
// not an alias
return $alias;
}
$pos = strpos($alias, '/');
$root = $pos === false ? $alias : substr($alias, 0, $pos);
if (isset(static::$aliases[$root])) {
if (is_string(static::$aliases[$root])) {
// 返回别名中的地址与类名拼接后的字符串
return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos);
} else {
foreach (static::$aliases[$root] as $name => $path) {
if (strpos($alias . '/', $name . '/') === 0) {
return $path . substr($alias, strlen($name));
}
}
}
}
if ($throwException) {
throw new InvalidParamException("Invalid path alias: $alias");
} else {
return false;
}
}
例如,控制器的命名空间必须是 namespace app\controllers; 那么 app 就是一个别名。
这个别名在文件 vendor\yiisoft\yii2\base\Application.php 的 setBasePath 方法中写入的。
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。
QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235
我的淘宝店,可以进去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop
QQ:1542385235 (PHP、Java、安卓苹果app制作修改、页面切图、各类模板修改、仿站,数据库修复、WAP制作修改 。我们团队是专门做网站开发的,都是有3年以上工作经验。需要后台系统开发,网页页面制作,app制作,ui设计的请加我qq联系。非诚勿扰!!)
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加!)。
QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)


浙公网安备 33010602011771号