接下来阅读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源码阅读笔记(二)的更多相关文章

  1. Yii源码阅读笔记(一)

    今天开始阅读yii2的源码,想深入了解一下yii框架的工作原理,同时学习一下优秀的编码规范和风格.在此记录一下阅读中的小心得. 每个框架都有一个入口文件,首先从入口文件开始,yii2的入口文件位于we ...

  2. werkzeug源码阅读笔记(二) 下

    wsgi.py----第二部分 pop_path_info()函数 先测试一下这个函数的作用: >>> from werkzeug.wsgi import pop_path_info ...

  3. werkzeug源码阅读笔记(二) 上

    因为第一部分是关于初始化的部分的,我就没有发布出来~ wsgi.py----第一部分 在分析这个模块之前, 需要了解一下WSGI, 大致了解了之后再继续~ get_current_url()函数 很明 ...

  4. Detectron2源码阅读笔记-(二)Registry&build_*方法

    ​ Trainer解析 我们继续Detectron2代码阅读笔记-(一)中的内容. 上图画出了detectron2文件夹中的三个子文件夹(tools,config,engine)之间的关系.那么剩下的 ...

  5. Yii源码阅读笔记(三十二)

    web/Application类的注释,继承base/Application类,针对web应用的一些处理: namespace yii\web; use Yii; use yii\base\Inval ...

  6. Yii源码阅读笔记(二十九)

    动态模型DynamicModel类,用于实现模型内数据验证: namespace yii\base; use yii\validators\Validator; /** * DynamicModel ...

  7. Yii源码阅读笔记(二十八)

    Yii/web中的Controller类,实现参数绑定,启动csrf验证功能,重定向页面功能: namespace yii\web; use Yii; use yii\base\InlineActio ...

  8. Yii源码阅读笔记(二十七)

    Theme 类,即一个应用的主题,主要通过替换路径实现主题的应用,里边的方法为获取根路径和根链接,以及应用主题的方法: namespace yii\base; use Yii; use yii\hel ...

  9. Yii源码阅读笔记(二十六)

    Application 类中设置路径的方法和调用ServiceLocator(服务定位器)加载运行时的组件的方法注释: /** * Handles the specified request. * 处 ...

随机推荐

  1. OpenStack Swift集群部署流程与简单使用

    之前介绍了<OpenStack Swift All In One安装部署流程与简单使用>,那么接下来就说一说Swift集群部署吧. 1. 简介 本文档详细描述了使用两台PC部署一个小型Sw ...

  2. [转]C# Winform ListView使用

    以下内容均来自网上,个人收集整理,具体出处也难确认了,就没写出处了: 一.基本使用: listView.View = View.Details;//设置视图 listView.SmallImageLi ...

  3. Sonar+Hudson+Maven构建系列之三:安装Hudson

    摘要:其实前面介绍过Sonar,后面Hudson安装就方便了.安装Hudson之前说说Hudson相关的事,现在世面上的有两种与Hudson相关的CI工具,一个是Hudson,一个是Jenkins,这 ...

  4. Java Serializable(序列化)

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...

  5. Spotlight on MySQL监控MySQL服务器

    第一步: 下载并安装mysql-connector-3.5x Spotlight on MySQL 连接mysql必须使用mysql-connector-3.5x,5.3.2版本我试了下不行,有兴趣可 ...

  6. Android 设计中的.9.png

    在 Android 的设计过程中,为了适配不同的手机分辨率,图片大多需要拉伸或者压缩,这样就出现了可以任意调整大小的一种图片格式“.9.png”.这种图片是用于Android开发的一种特殊的图片格式, ...

  7. 2016.6.11 ASP提交数据到SQL server数据乱码解决方法

    1.检查数据库排序规则 China-PRE-90-CS-AI 2.ASP文档中,写入数据的页面的编码和检查提交数据页面的编码一致:

  8. http://www.cnblogs.com/yjmyzz/p/3941043.html

    http://www.cnblogs.com/yjmyzz/p/3941043.html

  9. datetime与smalldatetime之间的区别

    1.一直以为smalldatetime和datetime的差别只是在于时间范围: smalldatetime的有效时间范围1900/1/1~2079/6/6datetime的有效时间范围1753/1/ ...

  10. POJ 1548 (二分图+最小路径覆盖)

    题目链接:http://poj.org/problem?id=1548 题目大意:给出一张地图上的垃圾,以及一堆机器人.每个机器人可以从左->右,上->下.走完就废.问最少派出多少个机器人 ...