码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-29 12:36:10      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   strong   文件   sp   

* 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?");
        }

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

标签:style   blog   color   io   os   使用   strong   文件   sp   

原文地址:http://www.cnblogs.com/rikioy/p/3999546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!