本系列的第四篇,也是最后一篇。首先我们来看一下Composer的源码是从哪里开始的。当然,请先准备源代码。composerinit或directinstall后,会自动生成一个vendor目录。这时候需要在文件中手动requirevendor目录下的autoload.php文件。事实上,这个文件被加载到vendor/composer/autoload\_real.php中。在autoload\_real.php中,我们找到了熟悉的spl\_autoload\_register函数。但是这个文件最大的作用就是加载ClassLoader.php文件和一些目录文件,也是在同一个目录下。这个文件值得仔细研究,但核心无非是前面三篇文章的内容。但是在autoload\_real.php中,可以发现在调用ClassLoader的register()函数之前,加载了几个目录相关的文件:autoload\_static.php,静态加载方式,顶级类加载命名空间autoload\_psr4。php,符合PSR4规范包目录映射数组文件autoload\_namespaces.php,命名空间映射,PSR0规范autoload\_classmap.php,类映射映射,命名空间直接映射路径感触颇深,不过你对PSR4一定已经很熟悉了明白了。其他的其实是一些不符合PSR4规范的类库。ClassLoader中的register()函数就是这些加载文件中对应的路径文件。在这里,最好的办法是你可以多下载一些包,然后看看这些文件有什么变化。比如我安装了一个monolog后,autoload\_psr4.php的内容变成了这样:接下来,你应该明白composer命令是干什么的了。执行composerrequire时,先修改composer.json文件,然后下载包,然后根据包中composer.json文件中对应的规范修改对应的autoload\_xxx.php文件。完成文件命名空间相关内容的映射。加载register()的时候,自然是得心应手。ClassLoader源码中需要重点阅读的一些函数包括:findFile()findFileWithExtension()addPsr4()add()相关参考文档:深入解析composer的自动加载原理更新了原理相关的内容。其实要学的东西更多。比如安装时的install文件,其实就是一个php文件。composer命令也是一个phar文件,完全用PHP实现。源码的Github地址:https://github.com/composer/composer。也许以后可以进一步研究核心composer命令行相关的源码。到时候再开始一个系列的文章,这一次先到此为止吧!!关注公众号:【硬核项目经理】获取最新文章加微信/QQ好友:【xiaoyuezigoggong/149844827】免费PHP、项目管理学习资料知乎、公众号、抖音、头条搜索【硬核项目经理】B站号:482780532
