博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YII框架的类自动加载机制
阅读量:5366 次
发布时间:2019-06-15

本文共 2371 字,大约阅读时间需要 7 分钟。

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群:   281442983 (点击链接加入群:)    QQ:1542385235

 

YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现。

先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法

public static function autoload($className)    {        if (isset(static::$classMap[$className])) { //先去类地图里面找            $classFile = static::$classMap[$className];            if ($classFile[0] === '@') {                $classFile = static::getAlias($classFile);            }        } elseif (strpos($className, '\\') !== false) { //然后再通过别名计算得到类文件地址            $classFile = static::getAlias('@' . str_replace('\\', '/', $className) . '.php', false);            if ($classFile === false || !is_file($classFile)) {                return;            }        } else {            return;        }        include($classFile);        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?");        }    }

类地图文件:vendor\yiisoft\yii2\classes.php 它会在 vendor\yiisoft\yii2\Yii.php 文件中载入进来。

下面再看,别名方法。

public static function getAlias($alias, $throwException = true)    {        if (strncmp($alias, '@', 1)) {            // not an alias            return $alias;        }        $pos = strpos($alias, '/');        $root = $pos === false ? $alias : substr($alias, 0, $pos);        if (isset(static::$aliases[$root])) {            if (is_string(static::$aliases[$root])) {
          // 返回别名中的地址与类名拼接后的字符串 return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos); } else { foreach (static::$aliases[$root] as $name => $path) { if (strpos($alias . '/', $name . '/') === 0) { return $path . substr($alias, strlen($name)); } } } } if ($throwException) { throw new InvalidParamException("Invalid path alias: $alias"); } else { return false; } }

例如,控制器的命名空间必须是 namespace app\controllers; 那么 app 就是一个别名。

这个别名在文件 vendor\yiisoft\yii2\base\Application.php 的 setBasePath 方法中写入的。

 

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群:   281442983 (点击链接加入群:)    QQ:1542385235

 

我的淘宝店,可以进去逛逛噢:

 

转载于:https://www.cnblogs.com/piwefei/p/5337574.html

你可能感兴趣的文章
JQuery UI 插件
查看>>
全能无线渗透测试工具,一个LAZY就搞定了
查看>>
epoll()无论涉及wait队列分析
查看>>
SQL的入门学习(二)
查看>>
C++ struct 定义及初始化
查看>>
Interpolation methods
查看>>
平时二十测
查看>>
JavaSE教程-03Java中分支语句与四种进制转换
查看>>
QTP常用插件下载
查看>>
hdu 4218 模拟 根据一个圆点和半径画一个圆 注意半径要求
查看>>
一、PHP MongoDB Windows7_64位安装与配置
查看>>
contextify::ContextifyScript::New(const v8::FunctionCallbackInfo<v8::Value>&):
查看>>
自己在完第一遍STL和Directx 9.0 游戏开发编程基础书后的体会
查看>>
#leetcode刷题之路21-合并两个有序链表
查看>>
begin.lydsy 入门OJ题库:3611-3613:神炎皇、降雷皇、幻魔皇
查看>>
ADO.NET简介
查看>>
Node.js + Express + Mongodb 开发搭建个人网站(一)
查看>>
流动贴图需要注意的问题
查看>>
unity, shader, Tags的位置
查看>>
打印日志的10个建议
查看>>