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

Yii源码阅读笔记(二)

时间:2016-04-11 01:29:11      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

接下来阅读BaseYii.php

vendor/yiisoft/yii2/Yii.php——

1 namespace yii;
2 
3 use yii\base\InvalidConfigException;
4 use yii\base\InvalidParamException;
5 use yii\base\UnknownClassException;
6 use yii\log\Logger;
7 use yii\di\Container;

第1行定义命名空间为yii;

第3到7行使用了命名空间;

 1 /**
 2  * Gets the application start timestamp.
 3  */
 4 defined(‘YII_BEGIN_TIME‘) or define(‘YII_BEGIN_TIME‘, microtime(true));
 5 /**
 6  * This constant defines the framework installation directory.
 7  */
 8 defined(‘YII2_PATH‘) or define(‘YII2_PATH‘, __DIR__);
 9 /**
10  * This constant defines whether the application should be in debug mode or not. Defaults to false.
11  */
12 defined(‘YII_DEBUG‘) or define(‘YII_DEBUG‘, false);
13 /**
14  * This constant defines in which environment the application is running. Defaults to ‘prod‘, meaning production environment.
15  * You may define this constant in the bootstrap script. The value could be ‘prod‘ (production), ‘dev‘ (development), ‘test‘, ‘staging‘, etc.
16  */
17 defined(‘YII_ENV‘) or define(‘YII_ENV‘, ‘prod‘);
18 /**
19  * Whether the the application is running in production environment
20  */
21 defined(‘YII_ENV_PROD‘) or define(‘YII_ENV_PROD‘, YII_ENV === ‘prod‘);
22 /**
23  * Whether the the application is running in development environment
24  */
25 defined(‘YII_ENV_DEV‘) or define(‘YII_ENV_DEV‘, YII_ENV === ‘dev‘);
26 /**
27  * Whether the the application is running in testing environment
28  */
29 defined(‘YII_ENV_TEST‘) or define(‘YII_ENV_TEST‘, YII_ENV === ‘test‘);
30 
31 /**
32  * This constant defines whether error handling should be enabled. Defaults to true.
33  */
34 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‘;
    }

 接下来的方法是通过路径别名获取路径,想知道如何获取路径,首先需要知道如何设置路径别名,所以先阅读设置路径别名的方法:

 1 public static function setAlias($alias, $path)
 2     {
 3         if (strncmp($alias, ‘@‘, 1)) {
       //判断别名是否以@开始,如果不是,则添加@开头
4 $alias = ‘@‘ . $alias; 5 }
      //通过/的位置获取根别名,如果别名中没有/,则别名就是根别名,否则截取/前面的作为根别名
6 $pos = strpos($alias, ‘/‘); 7 $root = $pos === false ? $alias : substr($alias, 0, $pos); 8 if ($path !== null) {
        //通过三元运算符判断路径中是否包含别名,如果包含,调用getAlias解析别名,否则去掉路径右边的斜线 到这里才知道为什么getAlias方法会在前面了
         //strncmp 用来比较两个字符串的指定长度,相等返回0
9 $path = strncmp($path, ‘@‘, 1) ? rtrim($path, ‘\\/‘) : static::getAlias($path); 10 if (!isset(static::$aliases[$root])) {//如果还没有设置过这个根别名 11 if ($pos === false) { 12 static::$aliases[$root] = $path;//在别名数组中添加该根别名,键名为根别名,值为对应的路径 13 } else { 14 static::$aliases[$root] = [$alias => $path];//否则,路径为对应的一个数组 15 } 16 } elseif (is_string(static::$aliases[$root])) {//如果注册过根别名,即根别名对应的值为字符串 17 if ($pos === false) { 18 static::$aliases[$root] = $path;//当前注册的是根别名,则覆盖原来的值 19 } else {//否则,把当前的别名和根别名添加到数组中 20 static::$aliases[$root] = [ 21 $alias => $path, 22 $root => static::$aliases[$root], 23 ]; 24 } 25 } else {//添加别名到根别名数组 26 static::$aliases[$root][$alias] = $path; 27 krsort(static::$aliases[$root]);//按照键名降序排序 28 } 29 } elseif (isset(static::$aliases[$root])) {
          //如果是根别名数组,删除子别名,机制类似于TP中的缓存方法和配置方法
30 if (is_array(static::$aliases[$root])) { 31 unset(static::$aliases[$root][$alias]); 32 } elseif ($pos === false) {
            //删除整个根别名数组
33 unset(static::$aliases[$root]); 34 } 35 } 36 }

通过别名获取路径的方法:

 1 public static function getAlias($alias, $throwException = true){

3 if (strncmp($alias, ‘@‘, 1)) { 4 //判断$alias中的第一个字符是否为@,如果不是@,则传入的参数不是别名,不做处理返回参数本身; 5 return $alias; 6 } 7        //通过/获取根别名 8 $pos = strpos($alias, ‘/‘);
9 $root = $pos === false ? $alias : substr($alias, 0, $pos); 10 11 if (isset(static::$aliases[$root])//判断别名常量中是否存在该别名) { 12 if (is_string(static::$aliases[$root]//判断根别名的值是否为字符串,如果是字符串,表示只设置了一个根别名)) {
           //通过三元运算符判断如果取得别名是根别名,直接返回根别名路径,否则返回根别名+去掉根别名的路径
13 return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos); 14 } else {
          //如果根别名的值不是字符串,表示设置了子别名,遍历子别名
15 foreach (static::$aliases[$root] as $name => $path) { 16 if (strpos($alias . ‘/‘, $name . ‘/‘) === 0) { 17 return $path . substr($alias, strlen($name)); 18 } 19 } 20 } 21 } 22      //如果输入的别名有异常,返回false 23 if ($throwException) { 24 throw new InvalidParamException("Invalid path alias: $alias"); 25 } else { 26 return false; 27 } 28 }

写到一半的时候才发现可以用注释的方式,瞬间觉得自己好low啊(●‘?‘●)!!

 

 

Yii源码阅读笔记(二)

标签:

原文地址:http://www.cnblogs.com/isleep/p/5376580.html

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