require.php只在校验阶段拦住composer install,config.platform.php仅让依赖解析“假装”在另一PHP版本下运行;两者均不管理运行时,PHP 7.4执行PHP 8.2构建的vendor仍会因match等新语法报错。

composer.json里require.php和config.platform.php到底谁管 runtime?
两者都不管 runtime——require.php只在校验阶段拦住 composer install,config.platform.php只是让依赖解析“假装”在另一个 PHP 版本下运行。你用 PHP 7.4 执行一个为 PHP 8.2 构建的 vendor,照样会遇到 ParseError: syntax error, unexpected token "match"。
常见误操作:
- 本地 PHP 是 7.4,却设
"config": { "platform": { "php": "8.2.0" } },然后composer update成功 → 结果部署到 8.2 环境时 vendor 里混进了 7.4 兼容包(因为锁文件没重生成) -
require.php写成"php": "8.2"(精确匹配),导致 PHP 8.2.10 被拒绝,应写"^8.2"或=8.2.0" - 改了
config.platform.php但没删composer.lock和vendor/,直接composer install→ 旧锁文件仍按原平台解析,无效
SDK封装时如何声明PHP版本兼容范围?
SDK 的 composer.json 必须用 require.php 明确声明支持的最低版本,且不能写逻辑或(如 "^7.4 || ^8.1" 是非法的)。Composer 不支持 ||,只能用交集式约束覆盖多个主版本。
推荐写法:
立即学习“PHP免费学习笔记(深入)”;
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
"php": ">=7.4.0 :覆盖 7.4–8.2 全部小版本,避免被 8.3 新语法(如 readonly class 属性)意外触发-
"php": "^7.4 || ^8.0"❌ 无效,会被 Composer 忽略或报错 - 若 SDK 确实依赖 PHP 8.1+ 的枚举,就只写
"^8.1",别硬撑兼容 7.4 - 搭配
"ext-json": "*"、"ext-mbstring": "*"等扩展约束,CI 中用composer check-platform-reqs --no-dev真实校验
跨版本 SDK 发布时怎么避免 vendor 混用?
不同 PHP 版本生成的 vendor/ 不能复用——C 扩展 ABI 不同,autoload 文件嵌入了版本标识,混用会导致 Fatal error: Cannot declare class 或函数未定义。
CI 中必须做到:
- 每个 PHP 版本 job 都清空
vendor/和composer.lock,再独立执行composer install - 禁用跨版本的 Composer cache(GitHub Actions 中加
cache-dependency: ${{ runner.os }}-${{ matrix.php-version }}) - 不要用
--ignore-platform-reqs打包;它跳过所有检查,等于把兼容性风险甩给下游 - 发布前跑
php -d zend_extension=opcache.so -v确认目标环境扩展已加载,尤其opcache、igbinary这类影响序列化的扩展
SDK用户升级 PHP 后为什么还会报 Class not found?
不是 autoload 没生效,而是 SDK 自身的 PSR-4 映射路径在不同 PHP 版本下可能被不同 autoloader 解析出错——特别是当 SDK 使用了 class_alias() 或动态命名空间拼接时,PHP 8.0+ 的反射行为变化会让部分旧映射失效。
排查重点:
- 检查 SDK 的
autoload配置是否含通配符或相对路径(如"psr-4": { "Sdk\": "src/" }是安全的,"Sdk\": "./src/"在某些 CLI 环境下会失败) - 运行
composer dump-autoload -o后,打开vendor/composer/autoload_static.php,确认类名到文件路径的映射是否完整 - 如果 SDK 提供了
autoload-dev,确保生产环境没意外加载 dev autoloader(检查vendor/autoload.php是否包含 dev 分支逻辑) - 最隐蔽的坑:
composer.json里"autoload": { "files": ["src/helpers.php"] }中的全局函数,在 PHP 8.0+ 的 strict 模式下可能因类型声明不匹配被静默忽略


















