Yii源码阅读笔记(二)
接下来阅读BaseYii.php
vendor/yiisoft/yii2/BaseYii.php——
namespace yii; use yii\base\InvalidConfigException; use yii\base\InvalidParamException; use yii\base\UnknownClassException; use yii\log\Logger; use yii\di\Container;
第1行定义命名空间为yii;
第3到7行使用了命名空间;
/**
* Gets the application start timestamp.
*/
defined('YII_BEGIN_TIME') or define('YII_BEGIN_TIME', microtime(true));
/**
* This constant defines the framework installation directory.
*/
defined('YII2_PATH') or define('YII2_PATH', __DIR__);
/**
* This constant defines whether the application should be in debug mode or not. Defaults to false.
*/
defined('YII_DEBUG') or define('YII_DEBUG', false);
/**
* This constant defines in which environment the application is running. Defaults to 'prod', meaning production environment.
* You may define this constant in the bootstrap script. The value could be 'prod' (production), 'dev' (development), 'test', 'staging', etc.
*/
defined('YII_ENV') or define('YII_ENV', 'prod');
/**
* Whether the the application is running in production environment
*/
defined('YII_ENV_PROD') or define('YII_ENV_PROD', YII_ENV === 'prod');
/**
* Whether the the application is running in development environment
*/
defined('YII_ENV_DEV') or define('YII_ENV_DEV', YII_ENV === 'dev');
/**
* Whether the the application is running in testing environment
*/
defined('YII_ENV_TEST') or define('YII_ENV_TEST', YII_ENV === 'test');
/**
* This constant defines whether error handling should be enabled. Defaults to true.
*/
defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER', true);
接下来依次定义了启动时间、yii文件路径、是否启动调试、环境、产品环境、开发环境、测试环境、错误处理常量;
class BaseYii
{
声明BaseYii类,该类没有父类;
public static $classMap = []; public static $app; public static $aliases = ['@yii' => __DIR__]; public static $container;
定义了四个静态属性:
public static $classMap = [];用赋值为空数组的方式声明;根据注解理解该属性被用于Yii的自动加载机制(used by the Yii autoloading mechanism),键名为类名称,键值为对应的路径或者路径别名
public static $app; 该属性为应用实例;
public static $aliases = ['@yii' => __DIR__]; 该属性为路径别名;
public static $container; 该属性为依赖注入容器;
获取版本号方法:
public static function getVersion()
{
return '2.0.7';
}
接下来的方法是通过路径别名获取路径,想知道如何获取路径,首先需要知道如何设置路径别名,所以先阅读设置路径别名的方法:
public static function setAlias($alias, $path)
{
if (strncmp($alias, '@', 1)) { //判断别名是否以@开始,如果不是,则添加@开头
$alias = '@' . $alias;
} //通过/的位置获取根别名,如果别名中没有/,则别名就是根别名,否则截取/前面的作为根别名
$pos = strpos($alias, '/');
$root = $pos === false ? $alias : substr($alias, 0, $pos);
if ($path !== null) { //通过三元运算符判断路径中是否包含别名,如果包含,调用getAlias解析别名,否则去掉路径右边的斜线 到这里才知道为什么getAlias方法会在前面了 //strncmp 用来比较两个字符串的指定长度,相等返回0
$path = strncmp($path, '@', 1) ? rtrim($path, '\\/') : static::getAlias($path);
if (!isset(static::$aliases[$root])) {//如果还没有设置过这个根别名
if ($pos === false) {
static::$aliases[$root] = $path;//在别名数组中添加该根别名,键名为根别名,值为对应的路径
} else {
static::$aliases[$root] = [$alias => $path];//否则,路径为对应的一个数组
}
} elseif (is_string(static::$aliases[$root])) {//如果注册过根别名,即根别名对应的值为字符串
if ($pos === false) {
static::$aliases[$root] = $path;//当前注册的是根别名,则覆盖原来的值
} else {//否则,把当前的别名和根别名添加到数组中
static::$aliases[$root] = [
$alias => $path,
$root => static::$aliases[$root],
];
}
} else {//添加别名到根别名数组
static::$aliases[$root][$alias] = $path;
krsort(static::$aliases[$root]);//按照键名降序排序
}
} elseif (isset(static::$aliases[$root])) { //如果是根别名数组,删除子别名,机制类似于TP中的缓存方法和配置方法
if (is_array(static::$aliases[$root])) {
unset(static::$aliases[$root][$alias]);
} elseif ($pos === false) { //删除整个根别名数组
unset(static::$aliases[$root]);
}
}
}
通过别名获取路径的方法:
if (strncmp($alias, '@', 1)) {
//判断$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));
}
}
}
}
//如果输入的别名有异常,返回false
if ($throwException) {
throw new InvalidParamException("Invalid path alias: $alias");
} else {
return false;
}
}
写到一半的时候才发现可以用注释的方式,瞬间觉得自己好low啊(●'◡'●)!!
Yii源码阅读笔记(二)的更多相关文章
- Yii源码阅读笔记(一)
今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...
- werkzeug源码阅读笔记(二) 下
wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...
- werkzeug源码阅读笔记(二) 上
因为第一部分是关于初始化的部分的,我就没有发布出来~ wsgi.py----第一部分 在分析这个模块之前, 需要了解一下WSGI, 大致了解了之后再继续~ get_current_url()函数 很明 ...
- Detectron2源码阅读笔记-(二)Registry&build_*方法
Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...
- Yii源码阅读笔记(三十二)
web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...
- Yii源码阅读笔记(二十九)
动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...
- Yii源码阅读笔记(二十八)
Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...
- Yii源码阅读笔记(二十七)
Theme 类,即一个应用的主题,主要通过替换路径实现主题的应用,里边的方法为获取根路径和根链接,以及应用主题的方法: namespace yii\base; use Yii; use yii\hel ...
- Yii源码阅读笔记(二十六)
Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...
随机推荐
- Java中Json用法
首先导入json.jar,非常简单看过代码就明白怎么用了 package cn.mylucene; import java.util.HashMap; import java.util.Map; im ...
- 学SEO你其实只需要半个钟
网站上线之前: 关键词的分析以及选择: 关键词在我们网站的每个页面:首页,栏目页,文章都存在,它定位了你的网站的这个页面是做什么的,有什么内容,也是SEO中的最重要的部分. 网站必须确定并且设置好关键 ...
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例]
1.首先实现一个interceptor,在请求开始的时候MDC put一个Session标志,interceptor结束的时候remove掉 import javax.servlet.http.H ...
- Java Hour 9
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为7 Hour,请各位不吝赐教. Hour 9 方法 ...
- win8 鼠标失灵解决办法
前几天 也没更新,却不知道突然win8 pro 失灵了,是不是ms 后台运行的也不确定,不过更新之后就可以用了. 经供参考: 更新前: 更新后: 我的主板是华硕的,有时候需要重启几次鼠标才显示出来
- Sqlite实现默认时间为当前时间列的方法(转)
原文地址: http://blog.csdn.net/derryzhang/article/details/5033209 在SQL Server中,创建表格的时候,对于时间列有时候我们可以根据需要指 ...
- try-catch 示例
package unit5; import java.util.Scanner; import javax.print.CancelablePrintJob; import javax.sound.m ...
- SpringBoot相关
快速构建项目 第 1 步:将这个 Spring Boot 项目的打包方式设置为 war. <packaging>war</packaging> SpringBoot 默认有内嵌 ...
- js:数据结构笔记9--二叉树
树:以分层的方式存储数据:节点:根节点,子节点,父节点,叶子节点(没有任何子节点的节点):层:根节点开始0层: 二叉树:每个节点子节点不超过两个:查找快(比链表),添加,删除快(比数组): BST:二 ...
- DP(优化) UVALive 6073 Math Magic
/************************************************ * Author :Running_Time * Created Time :2015/10/28 ...