核心是“识别→替换→验证”三步闭环:用PHPCompatibility等工具扫描定位Deprecated/Removed函数(如each、create_function),按对照表替换为现代语法,再通过error_reporting(E_ALL|E_DEPRECATED)和测试验证。

PHP 不同版本函数废弃问题,核心是“识别→替换→验证”三步闭环,不靠猜、不靠试,用工具定位再动手改,多数项目1–2小时就能跑通。
快速定位废弃调用点
别手动翻代码,直接用静态分析工具扫:
- 装 PHPCompatibility:
composer require --dev phpcompatibility/php-compatibility - 扫描整个项目(比如适配 PHP 8.0):
phpcs --standard=PHPCompatibility --runtime-set testVersion 8.0 ./src - 重点看 Deprecated 和 Removed 类型报错,例如
each()、create_function()、mysql_connect() - 同时打开错误报告:在 php.ini 中设
error_reporting = E_ALL | E_DEPRECATED,或脚本开头加error_reporting(E_ALL | E_DEPRECATED);
高频废弃函数对照替换
这些函数在 PHP 7.2+ 已移除或弃用,必须改,不能绕:
-
mysql_* 系列 → 全部换成 PDO 或 mysqli:
mysql_query($sql)改为$pdo->query($sql)或mysqli_query($conn, $sql) -
create_function() → 改用匿名函数:
fn($a) => $a * 2(PHP 7.4+),或兼容写法function($a) { return $a * 2; } -
each() → 改用
foreach ($arr as $k => $v),或拆成key($arr)+current($arr) -
fgetss()、image2wbmp()、utf8_encode()/decode() → 查文档找对应替代方案,如用
strip_tags()替代fgetss(),用mb_convert_encoding()替代utf8_encode()
类型与行为变更要小心
这类问题不报错但结果错,容易漏检:
立即学习“PHP免费学习笔记(深入)”;
-
数组方括号赋值前未初始化:旧写法
$data[] = 'x';在$data是null或字符串时,PHP 7.2+ 报 Warning;应先判断:$data = $data ?? []; -
数学/字符串函数传入非标类型:如
sqrt('4')在 PHP 7.2+ 触发 Notice;统一加类型转换:sqrt((float)'4') -
JSON 解析容错变严:旧逻辑
json_decode($str) !== null不可靠;改用完整判断:$json = json_decode($str, true); if (json_last_error() !== JSON_ERROR_NONE) { /* 处理 */ } -
方法签名不兼容(尤其继承内部类):如扩展 PDO 时重写
prepare(),PHP 8.1+ 要求返回类型匹配PDOStatement|false,否则报 Deprecated;补上类型声明即可解决
临时兜底与长期治理
上线急、第三方库来不及改?可短期兜底,但别长期依赖:
- 缺失扩展(如 mcrypt):装 polyfill:
composer require alcaeus/mcrypt-polyfill - Composer 检查失败:在
composer.json的config.platform中声明虚拟扩展:"ext-mcrypt": "1.0" - 测试环境验证可用后,尽快删掉
--ignore-platform-reqs这类绕过参数 - 把
phpcompatibility加进 CI 流程,每次提交自动检查,防新代码踩坑



















