什么原因会导致一个Composer包在PHP 7环境中正确地自动加载,但在PHP 5上却不能?
什么原因会导致一个Composer包在PHP 7环境中正确地自动加载,但在PHP 5上却不能?
我为我的公司和一些客户开发了一个小型的内部使用库。这个库是在PHP 7环境下开发的。
它已经成功安装和使用在我的同事的电脑和一些运行PHP 7(包括7.0和7.1)的客户服务器上。最近,我遇到了一个在共享托管平台上运行PHP 5.6的客户,composer可以下载和安装包,没有任何错误,但是不能自动加载类,例如:
在PHP 7环境中运行正常,但在PHP 5中不行。我以为可能是共享托管的问题,但是我在我的电脑上启动了一个PHP 5虚拟机,并验证了自动加载也不起作用。
我检查了
vendor/composer
目录,发现文件完全相同。只有我的包无法自动加载,而它的依赖项(如GuzzleHttp
)可以正常加载,所以可能是我的包有问题,但我不知道该注意什么。补充说明,当由composer安装时,我的包的目录结构如下:
- MyVendor | - MyPackage | | - src | | | - client | | | | - ClientObject.php | | | - (其他文件和文件夹) | | - composer.json
在composer.json中定义的自动加载器为
"psr-4" : { "MyVendor\\MyPackage\\" : "src/" }
。
问题的原因是PHP7环境和PHP5环境所使用的文件系统不同。PHP7环境使用的是不区分大小写的文件系统(如NTFS、HFS+),而PHP5环境使用的是区分大小写的文件系统(如ext4)。这包括了在通常情况下使用区分大小写文件系统的系统上的共享/挂载文件夹,所以我建议未来的读者在这方面要特别小心。
如上所示,我的文件夹名称不符合PSR4规范(必须精确匹配大小写),但在不区分大小写的文件系统上,无论PHP版本如何,都不会出现任何问题。然而,如果您在其他区分大小写的文件系统上部署项目,就会出现问题。
因为在不区分大小写的文件系统上,您需要两次使用git mv
来将文件夹名称改为大写(类似于这样),如果您的项目已经有很多现有的子文件夹,这可能会变得很繁琐,所以我在这里留下一个可以自动完成此操作的bash脚本:(代码见上方)