* YII2版本为 yii basic 2.0.0RC
* YII2框架在 /vendor/yiisoft/yii2 目录下,所涉及文件都以此目录为基础
* 文本为个人学习内容,如有不正确的地方欢迎指正。
在web的入口文件index.php中有包含yii2的核心文件Yii.php
require(__DIR__ . ‘/../../vendor/yiisoft/yii2/Yii.php‘);
Yii.php 中 有一个类 Yii 继承自 \yii\BaseYii
class Yii extends \yii\BaseYii { }
紧接着就注册了自动加载类函数
spl_autoload_register([‘Yii‘, ‘autoload‘], true, true);
Yii类中的autoload函数,因为Yii类为空类,所以这个函数在BaseYii中找。
public static function autoload($className)
首先这个函数先判断一下$className在不在static::$classMap数组中,如果在这个数组中,则取数组中的值为$classFile,然后再取$classFile中的第一个字符判断下是否为@如果为@,则表示包含别名。需要使用 static::getAlias 函数获取到实际的类文件路径(分析getAlias函数)。实际代码如下:
if (isset(static::$classMap[$className])) { $classFile = static::$classMap[$className]; if ($classFile[0] === ‘@‘) { $classFile = static::getAlias($classFile); } }
static::$classMap 在Yii.php中包含classes.php文件中获取。
Yii::$classMap = include(__DIR__ . ‘/classes.php‘);
如果$className不在static::$classMap中,则拼接出类文件路径,其中也支持@别名
如果文件不存在或者类名不正确,则返回。代码如下:
} elseif (strpos($className, ‘\\‘) !== false) { $classFile = static::getAlias(‘@‘ . str_replace(‘\\‘, ‘/‘, $className) . ‘.php‘, false); if ($classFile === false || !is_file($classFile)) { return; } } else { return; }
最后,包含类文件后,判断一下类是否存在,如果不存在。抛出错误。
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?"); }
时间: 2024-10-09 06:34:42