deprecationdetector 是一个基于 php-parser 的轻量级静态扫描 cli 工具,专用于识别 php 语言级弃用(如 instanceof 弃用类、调用 #[deprecated] 函数、隐式 float→int 转换等),不依赖 autoload 或类型推导,扫描快(2–8 秒)、可集成 ci/cd,与运行时日志互补。

PHP 8.2 升级后,光靠运行时日志很难系统性发现所有弃用问题——比如 instanceof 检查已弃用类、调用废弃函数、隐式 float→int 转换等,这些在请求中可能不触发警告,却埋下 PHP 8.3+ 兼容隐患。DeprecationDetector 是一个轻量、专注、可集成的静态扫描工具,它不依赖 PHPStan 扩展生态,也不需要完整项目启动,适合 CI/CD 中快速卡点。
DeprecationDetector 是什么,和 PHPStan 有什么区别
DeprecationDetector 是独立 CLI 工具(基于 PHP-Parser),专为识别“语言级弃用”设计。它直接解析 AST,识别如:
-
function_name()调用被#[Deprecated]标记的函数或方法 -
$x instanceof DeprecatedClass这类类型检查 -
str_contains($s, null)向非空标量参数传null -
$arr[15.5]浮点数组键隐式截断
它不处理框架层弃用(如 Laravel 的 Str::snake() 替代方案),也不做类型推导或依赖分析——这正是它快而稳的原因。相比 PHPStan 的 phpstan-deprecation-rules,它无需配置扩展、不加载 autoload、不校验类型契约,纯语法层扫描,单次全量扫描通常在 2–8 秒内完成。
安装与基础扫描命令
推荐用 Composer 全局安装(兼容 PHP 8.0+):
composer global require php-deprecation-detector/deprecation-detector
首次运行前确保 ~/.composer/vendor/bin 在 $PATH 中。然后进入项目根目录执行:
deprecation-detector scan src/ --format=table
输出示例:
src/Service/UserExporter.php:42:17 — Calling deprecated function date_default_timezone_set() (since PHP 8.3)src/Model/Config.php:19:24 — instanceof check references deprecated class LegacyAdapter
tests/Unit/HelperTest.php:66:12 — Passing null to parameter #1 ($format) of type string in sprintf()
精准过滤与 CI 集成建议
默认扫描全部弃用项,但工程中常需分阶段治理。可用以下方式控制粒度:
- 只扫 PHP 8.2 新增弃用:
--php-version=8.2(自动排除 8.3+ 才引入的规则) - 跳过测试目录:
--exclude=tests/ --exclude=vendor/ - 导出为 JSON 供 CI 解析:
--format=json > deprecations.json - 仅报告错误级别为 critical 的项(如
instanceof弃用类、致命转换):--severity=critical
在 GitHub Actions 中可这样卡点:
- name: Scan for deprecations
run: |
deprecation-detector scan src/ --php-version=8.2 --severity=critical --fail-on-issue
加上 --fail-on-issue 后,只要发现一条 critical 级弃用,CI 就失败,强制修复再合入。
配合运行时日志做交叉验证
静态扫描会漏掉动态生成的弃用(如 ${$var} 插值、反射调用),所以要和运行时日志对齐:
- 本地开发:设
error_reporting = E_ALL | E_DEPRECATED+log_errors = On,访问关键接口,检查php_error.log - 自动化:用 PHPUnit 启动时捕获
E_DEPRECATED(通过set_error_handler收集并断言为空) - 关键差异点:DeprecationDetector 能发现
instanceof弃用类,但运行时不会报错;而动态属性赋值($obj->x = 1)在运行时必现警告,静态工具却无法 100% 推断——两者互补,不可替代。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











