您的位置:首页 > 编程语言 > PHP开发

YII2框架分析1:自动加载类

2014-09-29 11:43 453 查看

* 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?");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: