PHP 8.0 彻底移除了 mysql_、create_function()、each()、mcrypt_、assert() 字符串形式、__autoload() 和 money_format() 等函数,调用即报 Fatal error;须分别替换为 mysqli/PDO、匿名函数、foreach、openssl/sodium、布尔表达式、spl_autoload_register() 和 NumberFormatter。

PHP 8.0 起彻底移除了多个长期废弃的函数,不是“不推荐”,而是调用即报 Fatal error,项目一运行就崩溃。这些函数在 PHP 7.4 及更早版本中已被标记为 deprecated,但还能用;到了 PHP 8.0+ 就直接从内核里删掉了。
mysql_* 系列函数(最常见、最致命)
包括 mysql_connect()、mysql_query()、mysql_fetch_array()、mysql_real_escape_string() 等全部以 mysql_ 开头的函数。
- 原因:该扩展自 PHP 5.5.0 起废弃,PHP 7.0 正式移除,PHP 8.0 彻底清理残留引用
- 替代方案:必须改用
mysqli(面向对象或过程式)或PDO,且不能简单字符串替换——要补全连接对象、预处理逻辑、错误处理 - 典型错误:
Fatal error: Uncaught Error: Call to undefined function mysql_connect()
create_function()(动态函数生成)
用于运行时创建匿名函数,例如:$func = create_function('$a,$b', 'return $a + $b;');
- 原因:存在严重代码注入风险,且性能差、类型不可控
- 替代方案:统一改用匿名函数(closure),PHP 7.4+ 支持箭头函数(
fn($a, $b) => $a + $b) - 注意:旧代码若依赖
create_function返回的函数名做反射或调试,需重写逻辑
each()(数组指针迭代)
常用于 while (list($key, $value) = each($arr)) 这类写法。
立即学习“PHP免费学习笔记(深入)”;
- 原因:语义模糊、性能低、与 foreach 冗余,PHP 7.2 废弃,PHP 8.0 彻底删除
- 替代方案:优先改用
foreach ($arr as $key => $value);若需保留指针控制逻辑,可用key()+current()+next()手动模拟 - 特别注意:自定义
myEach()替代函数时,必须返回含[0]、[1]、['key']、['value']四个键的数组结构,否则老逻辑会出错
其他被移除的重要函数和特性
虽使用频率略低,但一旦存在就会导致启动失败或行为突变:
-
mcrypt_*系列(如mcrypt_encrypt):加密扩展已删,改用openssl_*或sodium_* -
assert()的字符串参数形式(assert('is_int($x)')):PHP 8.0 要求必须传布尔表达式,否则抛TypeError -
__autoload()函数:已被spl_autoload_register()完全取代,升级后自动加载失效 -
money_format()(PHP 8.0 移除,8.1+ 彻底消失):改用NumberFormatter类



















