zoukankan      html  css  js  c++  java
  • 学习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;
        }
    //-------------------------------------------------------------未完待续
  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/xwzj/p/5380952.html
Copyright © 2011-2022 走看看