YII框架的类自动加载机制

Posted piwenfei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YII框架的类自动加载机制相关的知识,希望对你有一定的参考价值。

YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现。

先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法

技术分享
public static function autoload($className)
    {
        if (isset(static::$classMap[$className])) { //先去类地图里面找
            $classFile = static::$classMap[$className];
            if ($classFile[0] === ‘@‘) {
                $classFile = static::getAlias($classFile);
            }
        } elseif (strpos($className, ‘\\‘) !== false) { //然后再通过别名计算得到类文件地址
            $classFile = static::getAlias(‘@‘ . str_replace(‘\\‘, ‘/‘, $className) . ‘.php‘, false);
            if ($classFile === false || !is_file($classFile)) {
                return;
            }
        } else {
            return;
        }

        include($classFile);

        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?");
        }
    }
技术分享

类地图文件:vendor\yiisoft\yii2\classes.php 它会在 vendor\yiisoft\yii2\Yii.php 文件中载入进来。

下面再看,别名方法。

技术分享
public static function getAlias($alias, $throwException = true)
    {
        if (strncmp($alias, ‘@‘, 1)) {
            // not an alias
            return $alias;
        }

        $pos = strpos($alias, ‘/‘);
        $root = $pos === false ? $alias : substr($alias, 0, $pos);

        if (isset(static::$aliases[$root])) {
            if (is_string(static::$aliases[$root])) {
          // 返回别名中的地址与类名拼接后的字符串 return $pos === false ? static::$aliases[$root] : static::$aliases[$root] . substr($alias, $pos); } else { foreach (static::$aliases[$root] as $name => $path) { if (strpos($alias . ‘/‘, $name . ‘/‘) === 0) { return $path . substr($alias, strlen($name)); } } } } if ($throwException) { throw new InvalidParamException("Invalid path alias: $alias"); } else { return false; } }
技术分享

例如,控制器的命名空间必须是 namespace app\controllers; 那么 app 就是一个别名。

这个别名在文件 vendor\yiisoft\yii2\base\Application.php 的 setBasePath 方法中写入的。

以上是关于YII框架的类自动加载机制的主要内容,如果未能解决你的问题,请参考以下文章

[Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

php使用命名空间时自动加载机制

PHP的类文件自动加载机制

yii2 如何用命名空间方式使用第三方类库

PHP的类自动加载机制

PSR : php编码规范