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?"); }
相关文章推荐
- yii2框架-composer的自动加载(二)
- yii2框架-yii2自身的自动加载(三)
- Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
- CI框架中类的自动加载问题分析
- Yii2框架类自动加载机制实例分析
- AngularJS使用ng-app自动加载bootstrap框架问题分析
- Laravel 框架 自动加载实现分析
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
- yii2框架-composer的自动加载
- thinkPHP5.0框架自动加载机制分析
- AngularJS框架的ng-app指令与自动加载实现方法分析
- CI框架中类的自动加载问题分析
- yii2框架-yii2自身的自动加载
- yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
- Laravel框架中composer自动加载的实现分析
- php框架之__autoload(自动加载)问题
- CI框架自动加载session出现报错的解决办法
- CI框架源码阅读笔记9 CI的自动加载机制autoload
- CI框架源码阅读笔记9 CI的自动加载机制autoload
- php _autoload自动加载类与机制分析