composer check-platform-reqs 不检测 php 8.2 动态属性废弃问题,它仅比对 composer.json 中显式声明的 php 版本与扩展,不解析代码、不触发运行时警告,通过≠无 e_deprecated 日志,需用 php -l、phpstan 等工具主动扫描。

composer check-platform-reqs 不会检测 PHP 8.2 废弃的动态属性(如 __get/__set 中对未声明属性的访问),它压根不解析代码,只比对 composer.json 里显式写的 "php" 版本约束和扩展声明。
它根本不知道“动态属性被废弃”这回事
PHP 8.2 将动态属性设为废弃(E_DEPRECATED),但这是运行时行为,不是语法错误,也不影响 Composer 的静态检查逻辑。只要 composer.json 里写的是 "php": ">=8.2" 或 "php": "^8.2",而你本地 php -v 输出是 8.2.x,check-platform-reqs 就标 [OK]——哪怕所有模型类都在疯狂用 $obj->undefined_prop = 1。
常见误判场景:
- 命令通过,
composer install成功,但一跑php artisan serve或php index.php就刷满 E_DEPRECATED 日志,甚至因error_reporting设置触发 fatal error - CI 流程里
check-platform-reqs过了,上线后监控突然报警:大量Deprecated: Creation of dynamic property - 你改了
composer.json的"php": "^8.3",但没清理旧代码里的动态属性,check-platform-reqs仍只校验版本号,不报任何 warning
怎么提前发现动态属性问题?别指望 check-platform-reqs
它不扫描 PHP 文件,不调用 token_get_all(),不读 vendor/ 里的源码。想暴露这类问题,得换工具:
- 用
php -d error_reporting=32767 -l src/手动触发解析时警告(但不会执行,也看不到运行时动态赋值) - 加
phpstan+phpstan-phpunit插件,规则phpstan/extension-installer可配dynamicProperty检查 - 在 CI 中跑
php -d error_reporting=E_ALL src/bootstrap.php 2>&1 | grep "Dynamic property"(需确保 bootstrap 触发了相关类加载) - 升级到 PHP 8.4 后,该警告会变成
E_COMPILE_ERROR,那时check-platform-reqs依然无感,但php -l会直接失败
check-platform-reqs 报错却和动态属性无关的典型干扰项
如果你看到 check-platform-reqs 失败,别急着去修动态属性——大概率是别的事:
-
ext-mbstring报 MISSING?先确认which php和 Composer 调用的是同一个二进制,再查那个php.ini是否启用了extension=mbstring -
php >=8.2报 FAIL?可能是config.platform.php锁死了"8.1.0",删掉或改成"^8.2"再试 -
ext-pdo_mysql显示 OK,但运行时报Class 'PDO' not found?说明 CLI 和 Web SAPI 加载了不同php.ini,check-platform-reqs只管 CLI 环境
真正麻烦的不是命令报错,而是它完全沉默——比如你漏写了 "ext-json": "*",而项目靠 json_encode() 存活,check-platform-reqs 一声不吭,直到 500 Internal Server Error 弹出来才反应过来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











