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

* 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?");
        }
posted @ 2014-09-29 11:43  rikioy  阅读(616)  评论(0编辑  收藏  举报