源码分析 (Loader.php)
- 先获取到定义好的所有类
get_declared_classes()
- 拿到
Composer
安装的类信息 - 将
../vendor/composer/autoload_static.php
内信息放入变量内 - 打完收工,这里有疑问没关系,先接着看
/** 存在 ../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)
- 大家可以看到,在上面定义好的数组里面就存在这两个内容
prefixLengthsPsr4, prefixDirsPsr4,files
Composer
的加载是在autoload_static.php
取到的映射关系-
以下是未安装任何包的源码
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', ), );
- 这个时候我使用
Composer
安装上topthink
的think-helper
,内部的映射关系就会变成以下这样安装命令 $ composer require topthink/think-helper
- 首先是多了一个
files
值,这个是安装包的路径 prefixLengthsPsr4
中t
多了一个think\\=>6
。这个的意思也挺简单think-helper
的命名空间是think
,加上\\
就是6个字符(\\
中夹带转义)prefixDirsPsr4
也一样相对与上一个做出一个路径映射- 好了,源码就这样很简单。讲的不算清楚还望见谅!!!
举个栗子
- 一般在多人项目当中,我们一般会将
vendor
内的文件设置忽略。但是因为种种原因有很多人会出现有包文件但没有修改autoload_static.php
。或者举例一个场景:比如 A 需要用到一个插件,使用Composer
下载好了之后。这个时候同事 B 偷懒直接将其插件文件复制过来。但是不管什么操作就是报错。那如何将一个复制的包载入到自动加载内呢- 比如这个时候我存在一个
think-test
插件,命名空间是think\test
- 修改
autoload_static.php
- 这样即可直接使用
- 比如这个时候我存在一个
© 著作权归作者所有
举报
发表评论
0/200