学习yii2.0框架阅读代码(三)

阅读 BaseYii Yii的辅助类核心框架 别名相关

<?php

namespace yii;

//定义命名空间,昨天修改了一天。。
use yiiaseInvalidConfigException;
use yiiaseInvalidParamException;
use yiiaseUnknownClassException;
use yiilogLogger;
use yiidiContainer;

//获取应用程序开始时间
defined('YII_BEGIN_TIME') or define('YII_BEGIN_TIME', microtime(true));

//框架安装目录
defined('YII2_PATH') or define('YII2_PATH', __DIR__);

//应用程序是否应在调试模式,默认值为false
defined('YII_DEBUG') or define('YII_DEBUG', false);

//环境的配置,默认为最终的成品环境prod
defined('YII_ENV') or define('YII_ENV', 'prod');

//在生产环境中是否运行的应用程序
defined('YII_ENV_PROD') or define('YII_ENV_PROD', YII_ENV === 'prod');

//在应用程序是否运行在开发环境
defined('YII_ENV_DEV') or define('YII_ENV_DEV', YII_ENV === 'dev');

//在测试环境中是否运行的应用程序
defined('YII_ENV_TEST') or define('YII_ENV_TEST', YII_ENV === 'test');

//这个常量定义错误处理是否应该启用,默认值为true
defined('YII_ENABLE_ERROR_HANDLER') or define('YII_ENABLE_ERROR_HANDLER', true);

//声明一个BaseYii类
class BaseYii
{
    //定义一个静态属性$classMap,赋值你个空字符串
    public static $classMap = [];
    
    //定义一个静态属性$app,为应用实例
    public static $app;

    //定义一个静态属性$aliases,Yii 的路径别名的 Map, 默认 @yii 指向当前目录
    public static $aliases = ['@yii' => __DIR__];

    //定义一个静态属性$container,用于容器使用的依赖注入(DI)容器
    public static $container;


    //版本号
    public static function getVersion()
    {
        return '2.0.0';
    }

    //将路径别名转化为实际的路径
    public static function getAlias($alias, $throwException = true)
    {   
        if (strncmp($alias, '@', 1)) {
        // 如果 $alias 不是以 '@' 开头的,就不是一个 Yii 的别名
            return $alias;
        }
        // 获取 / 在 $alias 中首次出现的位置
        $pos = strpos($alias, '/');
        // 如果 / 不存在,$root 就是整个 $alias,否则就是 $alias 中 / 前的内容
        $root = $pos === false ? $alias : substr($alias, 0, $pos);
        
        
        //判断$root是否存在
        if (isset(static::$aliases[$root])) {
        
       //如果 $root 对应的别名是一个字符串,之直接返回 $aliases[$root] 或者 $aliases[$root] . substr($alias, $pos)
            if (is_string(static::$aliases[$root])) {
                return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos);
            } else {
                
                 //否则,要遍历整个 $aliases[$root] 数组,找到 $name 与 $alias 相同的值,返回 $path . substr($alias, strlen($name))
                 // 其实是返回了 $path 拼接上 $alias 除去 $root 后,剩下的字符串
                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;
        }
    }


    //返回根别名的一部分,一个给定的别名
    //根别名是已经注册别名通过[[setAlias()]]
    //如果一个给定的别名匹配多个根别名,将返回最长的一个
    public static function getRootAlias($alias)
    {
        $pos = strpos($alias, '/');
        $root = $pos === false ? $alias : substr($alias, 0, $pos);
        
        //判断$root是否存在
        if (isset(static::$aliases[$root])) {
            //同上
            if (is_string(static::$aliases[$root])) {
                return $root;
            } else {
                //同上
                foreach (static::$aliases[$root] as $name => $path) {
                    if (strpos($alias . '/', $name . '/') === 0) {
                        return $name;
                    }
                }
            }
        }

        return false;
    }
//-------------------------------------------------------------未完待续
原文地址:https://www.cnblogs.com/xwzj/p/5380952.html