zoukankan      html  css  js  c++  java
  • 学习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));
            }
        }
  • 相关阅读:
    hdu--2852--树状数组
    hdu--2848--未解决
    二进制与十进制之间蛮好的转换方式
    hdu--2846--字典树<怪我思维不够跳跃>
    hdu--2845--dp
    hdu--2844--多重背包
    hdu--1789--贪心||优先队列
    hdu--1978--记忆化深度搜索||递推
    hdu--2830--任意交换列的矩阵
    hdu--1506--矩阵求和<stack>
  • 原文地址:https://www.cnblogs.com/xwzj/p/5389590.html
Copyright © 2011-2022 走看看