zoukankan      html  css  js  c++  java
  • YII框架的类自动加载机制

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

    QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

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

    先看文件 vendoryiisoftyii2BaseYii.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?");
            }
        }
    复制代码

    类地图文件:vendoryiisoftyii2classes.php 它会在 vendoryiisoftyii2Yii.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 appcontrollers; 那么 app 就是一个别名。

    这个别名在文件 vendoryiisoftyii2aseApplication.php 的 setBasePath 方法中写入的。

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

    QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

    我的淘宝店,可以进去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop

  • 相关阅读:
    Spring和SpringMVC的关系
    The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory的解决方法
    java面试题
    单例模式
    java中的继承关系
    java重载
    JSP页面读取数据中的数据内容,出现乱码现象的解决方法
    java中时间与时间戳的相互转换
    java中重写
    eclipse中经常用到的修改菜单项
  • 原文地址:https://www.cnblogs.com/piwefei/p/5337574.html
Copyright © 2011-2022 走看看