检测项目中已弃用的PHP API需三管齐下:用PHPStan(启用phpstan-deprecation-rules)或Psalm做静态扫描,识别@deprecated标记调用;开启E_DEPRECATED运行时警告并记录日志;对照目标PHP版本(如8.6/8.7)官方废弃清单人工核查并grep高频废弃函数。

检测项目中已弃用的 PHP API,核心是结合静态分析、运行时日志和版本特性三方面协同工作。单靠某一种方式容易漏掉隐性调用或跨版本差异,实际落地需分层推进。
用 PHPStan 或 Psalm 做静态扫描
这是最主动、最前置的检测手段,尤其适合发现被 @deprecated 标记的方法、函数或类的调用。
- 安装扩展:PHPStan 需额外启用
phpstan-deprecation-rules才能识别method.deprecated类错误;Psalm 则默认支持废弃标记检测 - 运行命令:
vendor/bin/phpstan analyse src/ --level=8(Level 7 起开始覆盖大部分废弃检查) - 关键点:只有写在
/** @deprecated */这种标准 PHPDoc 块里的标记才会被识别,/* @deprecated */或//注释无效 - 输出示例:
Call to deprecated method getUser() of class UserRepository,直接定位到调用位置
开启运行时弃用警告并捕获日志
PHP 自身会在执行时对废弃功能触发 E_DEPRECATED 级别错误,但默认不显示——需主动配置才能暴露问题。
- 在入口文件顶部加:
error_reporting(E_ALL | E_DEPRECATED); - 或在 php.ini 中设:
error_reporting = E_ALL+display_errors = Off+log_errors = On,确保所有弃用提示写入 error_log - 重点关注的运行时废弃行为包括:
create_function()、each()、动态属性赋值(PHP 8.2+)、mbstring.http_input等 INI 配置项 - 注意:部分废弃(如 PHP 8.6 的
session_is_registered())可能直接报E_WARNING或Fatal error,需结合版本文档核对
按 PHP 版本查官方废弃清单做定向排查
不同 PHP 小版本废弃的内容差异明显,不能只依赖工具——必须对照目标升级版本(如 PHP 8.6 或 8.7)的变更说明人工核查。
立即学习“PHP免费学习笔记(深入)”;
- 高频废弃项速查:
create_function()(PHP 8.6 起废弃)、mysql_*系列(PHP 7.0+ 废弃,8.x 移除)、utf8_encode()/utf8_decode()(PHP 8.2+ 废弃) - 搜索代码库:
grep -r "create_function\|each\|mysql_\|utf8_encode\|utf8_decode" ./src/快速定位疑似调用 - 关注扩展级废弃:如
ext/soap的非 WSDL 模式(PHP 8.7 废弃)、ext-gd的image2wbmp()(PHP 7.3+ 废弃) - 检查 composer.json 中第三方包是否声明支持目标 PHP 版本,避免依赖链带入废弃调用
构建兼容性测试流水线
把检测动作固化到 CI 流程中,避免人为遗漏。
- Docker 启动目标 PHP 版本容器(如
php:8.6-cli),挂载项目代码并执行静态分析 + 单元测试 - 在测试脚本中加入
ini_set('error_reporting', E_ALL | E_DEPRECATED);并捕获 stderr 输出 - 对关键废弃项编写专项断言,例如:
assert(!function_exists('create_function'));(适用于 PHP 8.6+ 环境) - 生成 baseline 文件(如 PHPStan 的
--generate-baseline)可暂存已知问题,但需定期 review 清理



















