PHPStan可直接扫描发现PHP 8.1硬性不兼容点,需安装composer require --dev phpstan/phpstan,运行vendor/bin/phpstan analyse src/ --level=9 --php-version=8.1,配合phpstan/extension-installer、phpcompatibility及error_reporting = E_ALL交叉验证,按ERROR>WARNING>INFO分级修复。

直接用 PHPStan 扫描就能发现大部分硬性不兼容点,关键是配置对目标版本、开启足够检查级别,并配合其他工具交叉验证。
安装与基础扫描命令
在项目根目录执行:
- 安装:`composer require --dev phpstan/phpstan`
- 扫描全部 src/ 目录(适配 PHP 8.1):
vendor/bin/phpstan analyse src/ --level=9 --configuration=phpstan.neon - 若无配置文件,可临时指定版本规则:
vendor/bin/phpstan analyse src/ --level=9 --php-version=8.1
重点关注的 PHPStan 报告项
PHPStan level 9 会捕获以下 PHP 8.1 兼容性风险:
-
废弃魔术方法调用:如
__get()或__set()访问未声明属性,PHP 8.1 已发E_DEPRECATED,PHP 8.2+ 直接报错 -
类型不匹配:比如函数参数声明为
string,但实际传入null且未标注可空(?string),PHP 8.1 严格模式下易触发致命错误 -
扩展函数缺失提示:虽不直接报
mysql_*,但会标出未定义函数调用(前提是没装对应 stub);建议搭配 phpcompatibility 使用 -
联合类型误用:若代码已提前写
string|int但运行环境是 PHP 7.4,PHPStan 能反向提示“该语法在当前 PHP 版本不可用”
增强检测效果的配合动作
单靠 PHPStan 不够全面,需补充三项操作:
立即学习“PHP免费学习笔记(深入)”;
- 加装 phpstan-extension-installer:自动加载常用扩展的类型 stub(如 PDO、mbstring),让分析更准
-
并行跑 phpcompatibility:用 PHPCS + PHPCompatibility 标准专扫废弃函数:
phpcs --standard=PHPCompatibility --runtime-set testVersion 8.1 ./src -
开启 error_reporting = E_ALL:在测试环境的 php.ini 中打开所有错误提示,捕获运行时才暴露的
Deprecated和TypeError(如mb_strpos($s, 'x', round(5.6)))
结果解读与修复优先级
不用等所有 warning 清零再升级,按严重性分层处理:
- ERROR 级别必须改:如 “Call to undefined function create_function()”、“Undefined method xxx::yyy()”——这些一运行就崩
- WARNING 级别建议改:如 “Property xxx::$yyy is not defined”,PHP 8.1 暂不报错但日志刷屏,8.2+ 必挂
- INFO 级别可暂缓:如 “Method has no return typehint”,属于代码质量优化,不影响兼容性



















