什么原因会导致一个Composer包在PHP 7环境中正确地自动加载,但在PHP 5上却不能?

7 浏览
0 Comments

什么原因会导致一个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/" }

0
0 Comments

问题的原因是PHP7环境和PHP5环境所使用的文件系统不同。PHP7环境使用的是不区分大小写的文件系统(如NTFS、HFS+),而PHP5环境使用的是区分大小写的文件系统(如ext4)。这包括了在通常情况下使用区分大小写文件系统的系统上的共享/挂载文件夹,所以我建议未来的读者在这方面要特别小心。

如上所示,我的文件夹名称不符合PSR4规范(必须精确匹配大小写),但在不区分大小写的文件系统上,无论PHP版本如何,都不会出现任何问题。然而,如果您在其他区分大小写的文件系统上部署项目,就会出现问题。

因为在不区分大小写的文件系统上,您需要两次使用git mv来将文件夹名称改为大写(类似于这样),如果您的项目已经有很多现有的子文件夹,这可能会变得很繁琐,所以我在这里留下一个可以自动完成此操作的bash脚本:(代码见上方)

0