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;
        }
    //-------------------------------------------------------------未完待续
  • 相关阅读:
    Markdown简单介绍和基本的语法
    Unsupported major.minor version 51.0问题的解决
    Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
    kqueue演示样例
    华为离职副总裁徐家骏的工作感悟
    菜鸟之路-浅谈设计模式之单例设计模式
    【gsl】生成随机数
    【C语言】pragma
    【数据结构】二叉堆
    【编程题目】查找最小的 k 个元素
  • 原文地址:https://www.cnblogs.com/xwzj/p/5380952.html
Copyright © 2011-2022 走看看