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


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

       
          //用一个真实的路径注册一个别名
     
        public static function setAlias($alias, $path)
        {
            if (strncmp($alias, '@', 1)) {
                // 如果不是以 @ 开头,就将 @ 拼到开头
                $alias = '@' . $alias;
            }
            // 获取 / 在 $alias 中首次出现的位置
            $pos = strpos($alias, '/');
            // 如果 / 不存在,$root 就是整个 $alias,否则就是 $alias 中 / 前的内容
            $root = $pos === false ? $alias : substr($alias, 0, $pos);
            if ($path !== null) {
                // 如果 $path 以 @ 开头,使用 getAlias 去获取路径,否则,就去除掉最右边的 /
                $path = strncmp($path, '@', 1) ? rtrim($path, '\/') : static::getAlias($path);
                if (!isset(static::$aliases[$root])) {
                    // 如果不存在这个 $root 的别名
                    if ($pos === false) {
                        // 没有 /,就将 $path 直接赋值以为 $root 别名对应的路径
                        static::$aliases[$root] = $path;
                    } else {
                        // 否则,就将 $path 直接赋值为 $root 下的 $alias 的路径
                        static::$aliases[$root] = [$alias => $path];
                    }
                } elseif (is_string(static::$aliases[$root])) {
                    // 如果存在,而且是个string类型
                    if ($pos === false) {
                        // 没有 /,意味着 $alias 就是 $root,直接覆盖即可
                        static::$aliases[$root] = $path;
                    } else {
                        // 否则,就合并到一起
                        static::$aliases[$root] = [
                            $alias => $path,
                            $root => static::$aliases[$root],
                        ];
                    }
                } else {
                    // 这是个 array 类型
                    static::$aliases[$root][$alias] = $path;
                    // krsort — 对数组按照键名逆向排序
                    krsort(static::$aliases[$root]);
                }
            } elseif (isset(static::$aliases[$root])) {
                // $path 为空且对应的别名有值存在,就是要移除相应的别名
                if (is_array(static::$aliases[$root])) {
                    // 如果 $root 的别名对应一个 array,就只移除掉对应的别名即可
                    unset(static::$aliases[$root][$alias]);
                } elseif ($pos === false) {
                    // 如果 $root 的别名对应不是一个 array 而且 $root 就是 $alias,就移除这个 $root 的别名
                    unset(static::$aliases[$root]);
                }
            }
        }
    
       
        public static function autoload($className)
        {
            // 自动加载类
            if (isset(static::$classMap[$className])) {
                // 如果 $classMap 中存在该类,就直接使用
                $classFile = static::$classMap[$className];
                // 如果第一个字符串为'@',就意味着对应的文件地址是别名,就将它转化成真实的文件地址
                if ($classFile[0] === '@') {
                    $classFile = static::getAlias($classFile);
                }
            } elseif (strpos($className, '\') !== false) {
                // 如果存在'\',就意味着含有 namespace,可以拼成别名,再根据别名获取真实的文件地址
                $classFile = static::getAlias('@' . str_replace('\', '/', $className) . '.php', false);
                // 没取到真是文件地址或者获取的地址不是一个文件,就返回空
                if ($classFile === false || !is_file($classFile)) {
                    return;
                }
            } else {
                return;
            }
    
            // 引入该类的文件
            include($classFile);
    
            // 如果是调试模式,而且 $className 即不是类,不是接口,也不是 trait,就抛出异常
            if (YII_DEBUG && !class_exists($className, false) && !interface_exists($className, false) && !trait_exists($className, false)) {
                throw new UnknownClassException("Unable to find '$className' in file: $classFile. Namespace missing?");
            }
        }
    
        
        public static function createObject($type, array $params = [])
        {
            if (is_string($type)) {
                // 如果是一个字符串,就代表是类的名称,如:yiiwebErrorHandler
                return static::$container->get($type, $params);
            } elseif (is_array($type) && isset($type['class'])) {
                // 是个数组,其中的$type['class']代表类的名称
                $class = $type['class'];
                unset($type['class']);
                return static::$container->get($class, $params, $type);
            } elseif (is_callable($type, true)) {
                // 是个PHP callable,那就调用它,并将其返回值作为服务或组件的实例返回
                return call_user_func($type, $params);
            } elseif (is_array($type)) {
                throw new InvalidConfigException('Object configuration must be an array containing a "class" element.');
            } else {
                throw new InvalidConfigException("Unsupported configuration type: " . gettype($type));
            }
        }
  • 相关阅读:
    【Oracle/PLSQL】没事玩一个简单的表充值程序
    findmnt命令查找已挂载的文件系统
    如何让shell脚本变成可执行文件
    在Linux中如何查看文件的修改日期
    Dutree – Linux上的命令行磁盘使用情况分析工具
    用FRP做内网穿透使用远程桌面连接家里的windows电脑
    Dog-用于DNS查询的命令行工具
    【DeFi】一文读懂预言机原理、类型、现状和发展方向
    Vitalik Buterin 解读 Nathan Schneider 论文:加密经济治理的局限与改进思路
    Vitalik:回顾区块链近 5 年经济学进展,以及新出现的问题
  • 原文地址:https://www.cnblogs.com/xwzj/p/5389590.html
Copyright © 2020-2023  润新知