应先执行which php和composer show --platform确认PHP路径与版本一致,再通过composer config platform.php 8.3.0锁定平台版本并重启终端;若运行时报readonly错误,说明platform未配置,需补全且提交至git。

PHP 8.3 抢鲜版(如 8.3.0~8.3.6)下,Composer 安装能跑通,但默认行为极易导致依赖错配、运行时崩溃——关键不在 Composer 版本本身,而在 platform 配置缺失、CLI PHP 实际路径错位、以及对动态属性等新约束的静默放行。
composer show --platform 显示的 PHP 版本和 php -v 不一致怎么办
这是最常见也最危险的信号:Composer 实际校验的不是你“以为”的 PHP 环境。它会按 PATH 中第一个 php.exe 解析 platform,而你的终端可能已通过 alias 或 shell 配置临时切换了 php -v 输出,但 Composer 不认这个。
- 执行
which php(Linux/macOS)或where php(Windows),确认第一个路径是否指向 PHP 8.3 安装目录 - 执行
composer show --platform,看输出里php行是否为8.3.0(注意:必须是完整小版本号,8.3会被忽略) - 若不一致,别改 alias,直接修正 PATH:把 PHP 8.3 的 bin 目录移到 PATH 最前面;Windows 用户建议删掉旧 XAMPP/WAMP 的 php 路径
- 改完后**必须重启终端**,否则环境变量不生效——这点常被跳过,导致反复调试失败
composer install 成功但运行时报 Fatal error: Readonly classes are only supported on PHP 8.3+
Composer 没报错,是因为它根本不解析 PHP 语法。它只检查 composer.json 里声明的 "php": "^8.3" 是否匹配当前 platform,而不会管你代码里写了 readonly class 还是 #[\Attribute]。
- 错误根源:本地开发用 PHP 8.3,但 CI/CD 流水线用的是 8.2,
composer install仍成功(因 platform 未锁定),直到运行时 PHP 解析器炸掉 - 解决方式:在项目根目录执行
composer config platform.php 8.3.0,该配置会写入composer.json的config.platform字段 - 注意:
"php": "8.3"或"php": "^8.3"是无效写法,Composer 会静默忽略;必须是"8.3.0"这种完整语义化版本 - 提交
composer.json到 Git,确保团队和 CI 使用同一 platform 基准
phar-io/manifest 等 PHAR 工具在 PHP 8.3 下报错 Phar::getStub() 返回类型变化
这不是兼容性断裂,而是类型收敛:PHP 8.3 让 Phar::getStub() 在 stub 不存在时返回 null,而非 false。旧代码若用 === false 判断,就会逻辑失效。
立即学习“PHP免费学习笔记(深入)”;
- 典型错误现象:
if (Phar::getStub() === false) { /* 初始化 stub */ }在 PHP 8.3 下永远不进分支 - 修复方式:改为
=== null判断,或用!== false兼容旧版(但推荐前者,更语义清晰) -
phar-io/manifest已全量适配:其ManifestLoader.php和ManifestDocument.php均通过 PHP 8.3 测试,无须降级 - 自定义 PHAR 加载器若依赖
__get/__set处理未声明属性,必须加#[\AllowDynamicProperties],否则触发 Deprecation Notice
为什么 Laravel 11 / ThinkPHP 8 安装失败,却提示 ext-fileinfo 不满足
90% 的 “PHP 版本不满足” 报错,其实和 PHP 版本无关,而是扩展缺失。PHP 8.3 自带 ext-fileinfo,但 Windows 默认注释、Ubuntu/Debian 默认不装,导致 composer show --platform 显示 ext-fileinfo: false。
- Windows:打开
php.ini,取消;extension=php_fileinfo.dll前的分号,保存后重启终端再运行php -m | findstr fileinfo - Ubuntu/Debian:
sudo apt install php-fileinfo,然后重启 FPM 或 Apache - 临时绕过(仅限本地验证):
composer create-project laravel/laravel myapp --ignore-platform-req=ext-fileinfo - 切勿在生产环境用
--ignore-platform-req:它会跳过所有扩展检查,可能装上无法运行的包
真正卡住升级的往往不是语法报错,而是动态属性弃用警告、类常量类型收敛、JIT 对反射调用的主动降级——这些都不会让 Composer 安装失败,却会让应用在 PHP 8.3 下静默变慢或偶发崩溃。



















