PHP 5 到 PHP 8 迁移的核心障碍是 mysql 函数彻底移除、类型系统收紧、错误模型变更及大量函数行为/签名修改,不处理将导致 fatal error;必须替换为 mysqli/PDO、匿名函数、preg 等,并严格校验类型与参数。

PHP 5 到 PHP 8 的迁移不是“改几个函数就能跑”,核心障碍是 mysql_* 系列函数彻底消失、类型系统收紧、错误模型变更,以及大量函数行为/签名被修改。不处理这些,代码直接 fatal error。
mysql_connect 等函数已完全移除,必须换 mysqli 或 PDO
PHP 7.0 已废弃 mysql_connect、mysql_query、mysql_fetch_array,PHP 8.0 彻底删除 —— 运行时直接报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。
- 不要尝试用
extension=php_mysql.dll回滚(PHP 8 不再提供该扩展) - 优先选
PDO:兼容多种数据库、支持预处理、可统一抽象连接逻辑 - 若已有大量
mysqli脚本,可用面向对象写法快速替换:mysql_connect($h,$u,$p)→new mysqli($h, $u, $p);mysql_query($sql)→$mysqli->query($sql) - 注意:旧
mysql_result没有直译,需改用fetch_row()或fetch_assoc()
create_function 被移除,匿名函数或闭包替代
create_function 因安全风险(底层用 eval)在 PHP 7.2 废弃、PHP 8.0 删除。常见于回调注册、动态排序等场景,如 usort($arr, create_function('$a,$b', 'return $a[0] - $b[0];'))。
- 直接替换为匿名函数:
usort($arr, fn($a, $b) => $a[0] - $b[0])(PHP 7.4+) - 若需兼容低版本,改用普通函数名 + 字符串引用:
function cmp($a, $b) { return $a[0] - $b[0]; } usort($arr, 'cmp') - 别用
eval手动拼字符串函数 —— 安全漏洞+PHP 8 严格模式下更易出错
each()、mysql_escape_string()、ereg_* 等函数全部消失
这些函数在 PHP 7.x 中已标记 deprecated,PHP 8.0 彻底砍掉。典型报错:Uncaught Error: Call to undefined function each() 或 Undefined function ereg_replace()。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
-
each():循环数组请直接用foreach;若需手动控制指针(极少见),改用key()/current()/next() -
mysql_escape_string():已无对应函数,必须改用mysqli_real_escape_string()(需有效连接)或更推荐的预处理语句 -
ereg_*:全部替换为preg_*,注意正则语法差异 ——ereg('^[a-z]+$', $s)→preg_match('/^[a-z]+$/i', $s)(i修饰符补大小写,末尾加分隔符) - 所有
mysql_*、mcrypt_*、set_magic_quotes_runtime均不可恢复,强行加载扩展会失败
类型声明和错误处理变化导致运行时崩溃
PHP 8 默认启用严格类型(declare(strict_types=1) 虽非强制,但内置函数如 strlen(null)、array_key_exists(null, []) 会抛 TypeError,而 PHP 5/7 只警告或返回默认值。
- 检查所有函数调用参数是否为空、null、非数组 —— 尤其
count()、in_array()、json_decode()返回值未判空就直接用 -
json_decode($str)在 PHP 8 对无效 JSON 抛JsonException(需 try/catch),PHP 5 返回 null -
mb_*函数对非法编码字符串(如 UTF-8 中混入 \xFF)在 PHP 8 更敏感,建议统一加mb_substitute_character('none') - 错误报告级别升级:
E_DEPRECATED在 PHP 8 不再触发,但E_WARNING和E_NOTICE行为更严格,别依赖“没报错就等于正常”
最麻烦的不是函数名替换,而是那些隐式类型转换被堵死的地方 —— 比如把字符串 '0' 当 false 用、用 == 比较不同类型的 ID、或者把未初始化变量当空数组遍历。这些在 PHP 5 里静默通过,到 PHP 8 直接中断执行。


















