标签:
阅读 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)) { // 如果是一个字符串,就代表是类的名称,如:yii\web\ErrorHandler 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)); } }
标签:
原文地址:http://www.cnblogs.com/xwzj/p/5389590.html