PHP 8.0 彻底移除 mysql_*、create_function、each、__autoload 等函数及字符串 assert,调用即 Fatal error;strlen(null) 等类型敏感操作升级为 TypeError;必须全局替换为 mysqli/PDO、匿名函数、foreach、spl_autoload_register,并前置类型校验。

mysql_* 系列函数直接 Fatal error
调用 mysql_connect、mysql_query、mysql_fetch_array 会立刻崩溃,报 Fatal error: Uncaught Error: Call to undefined function mysql_connect()。PHP 8.0 彻底移除该扩展,连 warning 都不给,直接中断执行。
这不是“警告升级”,是硬删除。哪怕只在某个旧日志工具里残留一行 mysql_escape_string(),整个请求就挂。
- 必须全局搜索所有
mysql_*字符串,替换为mysqli或PDO - 注意
mysqli_query($conn, $sql)前,$conn必须是有效连接对象,不能只改函数名不补连接逻辑 -
mysql_real_escape_string()没有直接对应物,需改用mysqli::real_escape_string()或参数化查询
create_function 和 each() 调用即崩
create_function() 在 PHP 8.0 中被移除,任何用它动态生成回调的地方(比如旧版模板引擎、配置解析器)都会触发 Fatal error: Uncaught Error: Call to undefined function create_function()。
each() 同样被删,常见于老式数组遍历循环或分页逻辑中,报错同上——不是 warning,是直接不可恢复的 fatal。
立即学习“PHP免费学习笔记(深入)”;
-
create_function('a,b', 'return a+b;')→ 改用匿名函数:fn($a, $b) => $a + $b(PHP 7.4+)或function($a, $b) { return $a + $b; } -
while (list($k, $v) = each($arr)) { ... }→ 改用foreach ($arr as $k => $v) { ... } - 自定义
myEach()替代方案容易结构错位(如漏掉'key'键映射),不如直接换foreach
__autoload() 和 assert() 字符串参数失效
__autoload() 自 PHP 8.0 起彻底消失,如果项目还依赖它做类加载(尤其没用 Composer 的老系统),启动时就会 Class not found,且无提示指向哪一行。
assert() 若传字符串(如 assert('$x > 0')),PHP 8.0 开始拒绝执行,抛 ParseError 或静默跳过(取决于 assert.exception 配置),导致断言逻辑完全失效。
- 必须迁移到
spl_autoload_register(),哪怕只注册一个简单函数 -
assert($x > 0)是安全写法;字符串形式断言已成历史,别试图兼容 - 检查测试代码、调试工具、旧版权限校验模块,这些地方最容易藏字符串
assert
strlen(null)、count(null) 这类类型敏感操作变 TypeError
PHP 7.4 对 strlen(null) 返回 0(带 warning),PHP 8.0 直接 Uncaught TypeError: strlen(): Argument #1 ($string) must be of type string, null given。
同理 count(null)、array_key_exists(null, $arr) 全部升级为 fatal 级错误,不再容忍隐式转换。
- 这类问题常出现在未初始化变量、数据库字段为 NULL 时直接传入函数、API 参数缺失未兜底的场景
- 不要靠
@抑制错误,而应前置判断:is_string($s) ? strlen($s) : 0 -
count($arr ?? [])比count($arr)更安全,但最好明确知道$arr该是什么类型
最麻烦的不是报错本身,而是这些函数往往藏在第三方类库、静态工具文件、甚至 vendor 里的老旧依赖中——它们不会出现在你主动写的代码里,却会在某次请求中突然让整个页面 500。升级前务必跑一遍 grep -r "mysql_|create_function|each|__autoload" . --include="*.php",别信“没搜到就没事”。



















