标签:
阅读 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