菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
2292
0

ThinkPHP5.1.x 框架源码分析 (三) [框架的灵魂] - Composer 自动加载

原创
05/13 14:22
阅读数 1534

源码分析 (Loader.php)

  1. 先获取到定义好的所有类 get_declared_classes()
  2. 拿到 Composer 安装的类信息
  3. ../vendor/composer/autoload_static.php 内信息放入变量内
  4. 打完收工,这里有疑问没关系,先接着看
        /** 存在 ../vendor/composer/ Composer目录则加载 */
        if (is_dir(self::$composerPath)) {
            if (is_file(self::$composerPath . 'autoload_static.php')) {
                /** 加载 ../vendor/composer/autoload_static.php  */
                require self::$composerPath . 'autoload_static.php';
                /** 返回所有已经定义的类  */
                $declaredClass = get_declared_classes();
                /** 获取到最后一个类  */
                $composerClass = array_pop($declaredClass);
                /** 查看 Composer 已经安装的包  */
                foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {
                    /** 将一些设定好的数据放入到变量内  */
                    if (property_exists($composerClass, $attr)) {
                        self::${$attr} = $composerClass::${$attr};
                    }
                }
            } else {
                self::registerComposerLoader(self::$composerPath);
            }
        }

源码分析 (autoload_static.php)

  1. 大家可以看到,在上面定义好的数组里面就存在这两个内容 prefixLengthsPsr4, prefixDirsPsr4,files
  2. Composer 的加载是在 autoload_static.php 取到的映射关系
  3. 以下是未安装任何包的源码

    public static $prefixLengthsPsr4 = array (
        't' => 
        array (
            'think\\composer\\' => 15,
        ),
        'a' => 
        array (
            'app\\' => 4,
        ),
    );
    
    public static $prefixDirsPsr4 = array (
        'think\\composer\\' => 
        array (
            0 => __DIR__ . '/..' . '/topthink/think-installer/src',
        ),
        'app\\' => 
        array (
            0 => __DIR__ . '/../..' . '/application',
        ),
    );
  4. 这个时候我使用 Composer 安装上 topthinkthink-helper,内部的映射关系就会变成以下这样
    安装命令
    $ composer require topthink/think-helper

    ThinkPHP5.1.x 框架源码分析 (三) [框架的灵魂] - Composer自动加载支持

  5. 首先是多了一个 files 值,这个是安装包的路径
  6. prefixLengthsPsr4t多了一个 think\\=>6。这个的意思也挺简单 think-helper 的命名空间是 think,加上 \\就是6个字符(\\中夹带转义)
  7. prefixDirsPsr4 也一样相对与上一个做出一个路径映射
  8. 好了,源码就这样很简单。讲的不算清楚还望见谅!!!

举个栗子

  • 一般在多人项目当中,我们一般会将 vendor 内的文件设置忽略。但是因为种种原因有很多人会出现有包文件但没有修改 autoload_static.php。或者举例一个场景:比如 A 需要用到一个插件,使用 Composer 下载好了之后。这个时候同事 B 偷懒直接将其插件文件复制过来。但是不管什么操作就是报错。那如何将一个复制的包载入到自动加载内呢
    1. 比如这个时候我存在一个 think-test 插件,命名空间是 think\test
      ThinkPHP5.1.x 框架源码分析 (三) [框架的灵魂] - Composer自动加载支持
    2. 修改 autoload_static.php
      ThinkPHP5.1.x 框架源码分析 (三) [框架的灵魂] - Composer自动加载支持
    3. 这样即可直接使用
      ThinkPHP5.1.x 框架源码分析 (三) [框架的灵魂] - Composer自动加载支持

发表评论

0/200
2292 点赞
0 评论
收藏
为你推荐 换一批