gpt4 book ai didi

php - 什么会导致 Composer 包在 PHP 7 环境中正确自动加载,而不是 PHP 5?

转载 作者:搜寻专家 更新时间:2023-10-31 21:20:49 32 4
gpt4 key购买 nike

我开发了一个小型库,供我公司和我们的一些客户内部使用。该库是在 PHP 7 环境中开发的。

它已在我同事的计算机和我的一些运行 PHP 7(包括 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\.....

在 PHP 7 环境中运行良好,但在 PHP 5 环境中运行不佳。我认为它可能是共享主机,但我在我的机器上启动了一个 PHP 5 虚拟机,并验证自动加载也无法正常工作。

我检查了vendor/composer 目录,发现文件完全一样。自动加载只对我的包失败,而不是它的依赖项,例如 GuzzleHttp,所以我的包可能有问题,但我不知道要注意什么。

附录 当由 composer 安装时,我的包的目录结构:

- MyVendor
| - MyPackage
| | - src
| | | - client
| | | | - ClientObject.php
| | | - (other files and folders)
| | - composer.json

Autoloader 在 composer.json 中定义为 "psr-4": { "MyVendor\\MyPackage\\": "src/"}

最佳答案

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

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

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

因为您需要执行 git mv 两次以在不区分大小写的文件系统 ( like this ) 上将文件夹名称大写,如果您的项目已经有很多现有的子文件夹,它会变得乏味,所以我将在此处保留自动执行此操作的 bash 脚本:( gist here )

#!/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

关于php - 什么会导致 Composer 包在 PHP 7 环境中正确自动加载,而不是 PHP 5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49425423/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com