升级后di:compile提示Incompatible argument type,错误会给出类、参数位置、期望与实际类型。不要通过删除类型声明让编译通过。

解决方案

  1. 完整保存第一条编译错误。找到生成目标类的constructor,并用Reflection或源码确认父类当前版本的参数顺序与类型。
  2. 自定义类继承核心类时,升级后父构造函数新增/调整参数最常见。同步子类签名和parent::__construct调用,优先避免复制整个父构造函数。
  3. 若错误来自di.xml,检查argument name是否仍与构造函数参数名一致,xsi:type=object指向的类是否实现期望接口;virtualType链中同名参数也会覆盖。
  4. 清除旧generated/code与generated/metadata后重新compile。生产构建必须使用与运行环境相同的composer.lock和PHP主次版本。
排查命令
bin/magento setup:di:compile
rg -n '<argument name="problemArg"|<preference.*ExpectedInterface' app/code vendor
php -r "require 'app/bootstrap.php'; $r=new ReflectionClass('Vendor\Module\Model\Target'); foreach($r->getConstructor()->getParameters() as $p){echo $p,PHP_EOL;}"

回归测试

di:compile无错误,相关页面/CLI实际实例化目标类成功;同时运行静态分析或最小集成测试,确保不是靠可空默认值掩盖缺失依赖。

generated目录应在构建阶段重新生成,不要把旧环境生成物复制进新版本。