学习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));
        }
    }
原文地址:https://www.cnblogs.com/xwzj/p/5389590.html