必须在require中写"php": "^8.1",这是唯一触发安装拦截的校验位置;config.platform.php仅模拟环境,不替代require.php的强制约束作用。

composer.json里怎么声明PHP版本才有效
“锁定PHP版本”本质是声明兼容边界,不是让Composer去装PHP。你在composer.json的require字段写"php": ">=8.1.0 或<code>"php": "^8.1",才是真实起作用的写法。
别写"php": "8.1"——这会被解释为必须是8.1.0,连8.1.1都不满足;也别漏掉小数点后两位,"php": ">=8.1"在某些 Composer 版本里可能被宽松解析,导致意外匹配到8.2。
常见错误:本地 PHP 是 8.2,但项目只测过 8.1.x,结果上线后mbstring默认编码行为变了、json_decode返回类型变了,报错却怪 Composer 没“锁住”。
platform.php配置不是锁版本,是骗Composer
composer config platform.php 8.1.22只是让 Composer 在解析依赖时假装当前是 PHP 8.1.22,它不改你实际运行的 PHP,也不阻止你用 8.2 执行代码。
这个配置真正有用的地方是:CI 环境里 PHP 版本高(比如 8.3),但你想装只兼容 8.1 的旧包,又不能降级系统 PHP —— 这时加platform能让composer install通过校验。
注意:platform必须写进composer.json的config.platform下才能提交共享,否则只是本地生效;而且它只影响安装阶段,运行时该崩还是崩。
部署时怎么确保用对PHP版本
Composer 不管你用哪个 PHP 解释器,它只读php -v的结果。所以关键不是“让 Composer 锁”,而是让你的部署命令明确指定 PHP 路径:
• Linux:用/usr/bin/php8.1 composer install,别依赖php软链接
• macOS(Homebrew):先brew unlink php && brew link php@8.1,或直接调用/opt/homebrew/bin/php81
• Windows:写绝对路径,比如C:\php-8.1\php.exe composer install
CI 脚本里漏了这步,哪怕composer.json写得再准,也会用系统默认 PHP(可能是 8.2 或 8.3)去跑 install,然后装一堆只在高版本测试过的包。
为什么ignore-platform-req=php不能当常规方案
加--ignore-platform-req=php确实能跳过校验,但这是掩耳盗铃:
• 它不会修复语法问题——比如项目用了match表达式,而你用 PHP 8.0 运行,照样Fatal error
• 它不会补缺失扩展——ext-gd没装,ignore了也照样报Class not found
• 它会让composer.lock记录一个和实际环境不匹配的platform快照,下次别人拉代码composer install可能还原出不一致状态
真要用,只限临时调试或灰度验证,且必须配composer validate确认 lock 文件未被污染。
最易被忽略的点:PHP CLI 版本和 Web SAPI 版本可能不同,composer走的是 CLI,但你的 Apache/Nginx 走的是另一个。别只查php -v,还得确认phpinfo()里显示的版本,两边都得对齐。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











