PHP 8.0 彻底移除了 mysql_*、each()、create_function()、assert(字符串) 等函数及大括号字符串索引等语法,须改用 PDO/mysqli、foreach、匿名函数、布尔断言及方括号索引,并注意 mb_strpos 偏移量类型、框架助手函数调用方式变更。

PHP 7.4 升级到 8.0 时,一批早已标记为废弃的函数被彻底移除,不替换就会触发 Fatal error 直接中断运行。替换不是简单查找替换,关键在于理解语义、作用域和参数类型变化。
已移除的核心函数及安全替换方式
以下函数在 PHP 8.0 中完全不存在,必须手动修改:
-
mysql_* 系列函数(如 mysql_connect、mysql_query):已从 PHP 核心移除多年。必须改用
PDO或mysqli,且注意连接对象需显式传递。例如:
❌mysql_query("SELECT * FROM user")
✅$pdo->query("SELECT * FROM user")或mysqli_query($conn, "SELECT * FROM user")($conn必须是有效连接) -
each():用于数组遍历,但破坏 foreach 的内部指针且效率低。直接用
foreach替代:
❌while ($item = each($arr)) { echo $item['value']; }
✅foreach ($arr as $item) { echo $item; } -
create_function():存在代码注入风险,PHP 8.0 彻底删除。统一改用匿名函数:
❌$func = create_function('$x', 'return $x * 2;');
✅$func = fn($x) => $x * 2;(推荐,PHP 7.4+ 支持)或$func = function($x) { return $x * 2; };
注意闭包变量捕获:原函数在全局作用域执行,新写法需显式use,如function($x) use ($multiplier) { return $x * $multiplier; } -
assert() 接收字符串参数:PHP 7 中允许
assert('1===1'),但会动态执行字符串,极不安全;PHP 8 强制只接受布尔表达式:
❌assert('is_int($val) && $val > 0');
✅assert(is_int($val) && $val > 0);
易被忽略的类型与语法变更
有些不是“函数”,但调用方式一变就报错,升级中高频出问题:
-
mb_strpos 第三个参数($offset)不再接受 float:很多老代码用
round(strlen($s)/2)或strpos(...)/2得到偏移量,若结果是 float(如 5.0),PHP 8 会抛TypeError。
✅ 统一强转:mb_strpos($str, 'x', (int) $offset),哪怕 $offset 来自round()也建议包一层(int)防意外 -
大括号访问字符串/数组($str{$i}、$arr{$k})被废弃:
❌$first = $str{0};
✅$first = $str[0];(字符串索引和数组都统一用方括号) -
(real) 类型和 is_real():
❌$f = (real) $x;、is_real($x)
✅ 改用(float)和is_float()
框架相关废弃调用(以 ThinkPHP 5.1 为例)
如果你用的是旧版框架,全局助手函数也大量消失:
立即学习“PHP免费学习笔记(深入)”;
-
input()、cookie()、session()、config() 等全局函数全部移除:
✅input('id')→$this->request->param('id')(控制器内)或app('request')->param('id')(其他类)
✅cookie('token')→$this->cookie->get('token')
✅config('database.host')→think\facade\Config::get('database.host')(需use) -
Db::name() 不再可用:
❌Db::name('user')->find(1)
✅Db::table('user')->find(1)(注意传的是表名字符串,不是模型类名)
自动化辅助与验证建议
人工搜索容易遗漏,建议组合使用工具提升效率:
- 用
grep -r或 IDE 全局搜索关键词:mysql_、each(、create_function(、assert(.*"、{.*}(匹配大括号索引) - 启用静态分析工具:PHPStan 或 Psalm 配置 level 6+,能提前发现已移除函数调用和类型不兼容问题
- 升级前先在 PHP 7.4 开启
E_DEPRECATED错误报告,把所有弃用警告修复完,可大幅降低 PHP 8 迁移阻力



















