是什么导致Composer包在PHP7环境中正确自动加载,而不是PHP5?

是什么导致Composer包在PHP7环境中正确自动加载,而不是PHP5?,php,composer-php,Php,Composer Php,我开发了一个小型图书馆,供公司和一些客户内部使用。该库是在PHP7环境下开发的 它已经在我同事的计算机和一些运行PHP7(包括7.0和7.1)的客户端服务器上成功安装和使用。最近,我在一个运行PHP 5.6的共享托管平台上遇到了一个客户端,composer可以下载并安装该软件包,但不会自动加载类,例如: <?php include "vendor/autoload.php"; use MyVendor\MyPackage\Client\ClientObject; $client = new

我开发了一个小型图书馆,供公司和一些客户内部使用。该库是在PHP7环境下开发的

它已经在我同事的计算机和一些运行PHP7(包括7.0和7.1)的客户端服务器上成功安装和使用。最近,我在一个运行PHP 5.6的共享托管平台上遇到了一个客户端,composer可以下载并安装该软件包,但不会自动加载类,例如:

<?php
include "vendor/autoload.php";
use MyVendor\MyPackage\Client\ClientObject;
$client = new ClientObject();
// PHP 7 : OK
// PHP 5 : PHP Fatal Error: Cannot find class MyVendor\MyPackage\Client\.....

composer.json中定义为“psr-4”的Autoloader:{“MyVendor\\MyPackage\\”:“src/”}

回答我自己的问题:它不是PHP版本,而是不区分大小写的文件系统

碰巧的是,“有效”的PHP7环境是在不区分大小写的文件系统(NTFS、HFS+等)上,而PHP5环境是在区分大小写的环境(如ext4)上。这包括在通常具有区分大小写的文件系统(如linux文件系统)的系统上共享/装载文件夹,因此我敦促未来的读者对此格外小心

如上所示,我的文件夹名称不符合PSR4(必须完全匹配大小写),但这不会在不区分大小写的文件系统上标记任何问题,无论PHP版本如何。但是,如果您使用区分大小写的文件系统将您的项目部署到其他任何地方,它将中断

因为在一个不区分大小写的文件系统()上,您需要执行两次git mv来大写文件夹名称,所以如果您的项目已经有很多现有子文件夹,那么它可能会变得单调乏味,因此我将把这个自动执行此操作的bash脚本留在这里:()


也许可以分享更多关于您的软件包的信息,composer.json看起来像什么,类在哪里,等等。可能是大写还是小写<代码>客户端文件夹?虽然我不知道为什么在linux上的PHP5.6中会有不同的处理方式——文件名是区分大小写的,但windows不是added@NigelRen所有环境都是基于unix的。运行PHP7的MacOS、CentOS和Ubuntu已被验证正常工作。
- MyVendor
| - MyPackage
| | - src
| | | - client
| | | | - ClientObject.php
| | | - (other files and folders)
| | - composer.json
#!/bin/bash
for i in `find src -type d | grep -v '^src$' | sort -r`; do
  if [[ ! -e "$i"2 ]]; then
    mkdir -p "$i"2
  fi
  echo "start"
  for j in `find $i -maxdepth 1 -type f`; do
    echo $(git mv "$j" "$i"'2')
  done
  i2=`echo $i | sed -e "s/\b\(.\)/\u\1/g" | sed -e "s/Src/src/g"`
  for j in `find $i'2' -maxdepth 1 -type f`; do
    echo $(git mv "$j" "$i2")
  done
done

for i in `find src -type d | grep -v '^src$'`; do
  i2=`echo $i | sed -e "s/\b\(.\)/\u\1/g" | sed -e "s/Src/src/g"`
  rename $i $i2 $i
done


find . -type d -empty -name "*2" -delete