核心是分层定位风险:静态层用PHPCompatibility扫描废弃函数,依赖层用composer check-platform-reqs验包兼容性,运行层开启E_ALL|E_STRICT并触发关键路径捕获TypeError等异常。

批量扫描老代码适配 PHP 8.0,核心是分层定位风险:静态语法/函数废弃、依赖兼容性、运行时行为差异。不靠人工翻查,用三类工具组合覆盖全链路。
一、静态代码层:用 PHPCompatibility 扫废弃函数和移除特性
这是第一步,也是最高效的“排雷”手段。它能直接标出所有 each()、create_function()、mysql_* 等已在 PHP 8.0 彻底删除的调用位置。
- 安装:composer require --dev phpcompatibility/php-compatibility
- 扫描命令:
phpcs --standard=PHPCompatibility --runtime-set testVersion 8.0 .(当前目录递归扫描) - 重点看 ERROR 级别结果——这些基本必报错;WARNING 级可暂缓,但建议一并处理
- 搭配自动修复(可选):
phpcbf --standard=PHPCompatibility --runtime-set testVersion 8.0 .
二、依赖层:用 composer check-platform-reqs 验第三方包
很多崩溃不是你写的代码导致的,而是 vendor 里某个旧版组件不支持 PHP 8.0。这个命令会逐个检查每个包是否声明了 "php": "^8.0" 兼容性。
- 执行:
composer check-platform-reqs php:8.0 - 重点关注框架版本:Laravel ≥8.0、ThinkPHP ≥6.0.12、Symfony ≥5.4
- 关注扩展依赖:Redis ≥5.3.0、GD ≥2.3.0、xdebug ≥3.0(PHP 8.0 不兼容 xdebug 2.x)
- 若发现不兼容包,优先升级到最新稳定版;无更新则考虑替换或打补丁
三、运行时层:开启全错误报告 + 关键路径触发
有些问题只在运行时暴露,比如松散比较逻辑变化、strpos(null, 'x') 抛 TypeError、match 表达式类型不匹配等静默行为差异。
立即学习“PHP免费学习笔记(深入)”;
- 临时加到入口文件顶部:
error_reporting(E_ALL | E_STRICT); ini_set('display_errors', '1'); - 手动或脚本触发核心流程:用户登录、订单创建、数据导出、后台列表页
- 捕获三类新异常:TypeError、ValueError、ArgumentCountError
- 特别注意字符串函数(strpos、substr、str_replace)传入 null 的场景,PHP 7 会返回 false,PHP 8 直接炸
四、进阶补充:用 PHPStan 做类型安全加固
尤其适合已有类型提示或想借升级机会提升代码质量的项目。它能发现 未定义属性访问、魔术方法误用、数组偏移空值 等 PHP 8 下更易暴露的问题。
- 安装:
composer require --dev phpstan/phpstan - 基础扫描:
./vendor/bin/phpstan analyse src/ --level=7 - 配合框架扩展(如 ThinkPHP 或 Laravel)可大幅减少误报,需额外安装对应插件
- 首次运行后建议生成基线(baseline),把历史问题冻结,只关注新增风险



















