PHP 8.0 彻底移除 each() 和 create_function(),调用即报 Fatal error,必须用 foreach 和匿名函数(function 或 fn)替换,无法通过配置绕过。

小皮面板里 PHP 8.0 报 each() 或 create_function() 相关错误,不是靠改设置能绕过去的——这两个函数在 PHP 8.0 中已被**彻底移除**,调用就会触发 Fatal error,必须修改代码。设置(比如 error_reporting)只能让你看到报错,不能让旧函数“复活”。
先确认是不是真由这两个函数导致
别急着改代码,先定位问题源头:
- 打开网站根目录新建
test.php,写入<?php phpinfo(); ?>,访问确认当前 PHP 版本确实是 8.0+(小皮面板首页、PHP 设置页、命令行php -v三处都要核对) - 查看 PHP 错误日志:小皮面板 →「PHP 设置」→ 找到对应版本 → 点「错误日志」,或直接查路径(如
/www/wwwlogs/php_error.log)。找类似这样的报错:PHP Fatal error: Uncaught Error: Call to undefined function each()PHP Fatal error: Uncaught Error: Call to undefined function create_function() - 如果日志里没明确提示,但页面空白,就在入口文件(如
index.php)最顶部加三行强制显错:error_reporting(E_ALL);<br>ini_set('display_errors', '1');<br>ini_set('display_startup_errors', '1');
each() 的替代方案(必须改代码)
each() 原本用于配合 while 遍历数组,PHP 8.0 起完全不可用,直接换成 foreach 即可:
- 旧写法(PHP 7.x 及更早):
$arr = ['a' => 1, 'b' => 2];<br>while ($item = each($arr)) {<br> echo $item['key'] . ': ' . $item['value'];<br>} - 新写法(PHP 8.0 兼容):
$arr = ['a' => 1, 'b' => 2];<br>foreach ($arr as $key => $value) {<br> echo $key . ': ' . $value;<br>}
注意:如果原逻辑依赖 each() 的内部指针移动特性(比如多次调用),那整个遍历逻辑需要重写,foreach 是独立副本,不改变原数组指针。
使用 Infinimo AI 设计制作手持产品短视频:Avatar 首帧合成、AI 脚本、图转视频提交与轮询。适用于可购物短视频、Avatar 主导的产品演示和商品 listing 宣传视频。
立即学习“PHP免费学习笔记(深入)”;
create_function() 的替代方案(必须改代码)
create_function() 在 PHP 7.2 已废弃、8.0 彻底删除,且它本质是 eval(),有安全风险。一律替换为匿名函数:
- 旧写法:
$func = create_function('$x', 'return $x * 2;'); - PHP 7.4+ 推荐写法(闭包 + use):
$multiplier = 2;<br>$func = function($x) use ($multiplier) {<br> return $x * $multiplier;<br>}; - 如果只是简单表达式,可用箭头函数(PHP 7.4+):
$func = fn($x) => $x * 2;
重点:匿名函数作用域不同,原来 create_function() 能直接访问外部变量,现在必须用 use 显式传入;字符串拼接生成函数的动态逻辑,需重构为配置驱动或策略模式,不能硬编码进函数体。
小皮面板相关配置检查(辅助排查)
虽然改不了函数本身,但以下设置能帮你更快发现问题:
- 确保 PHP-FPM 已重启:小皮面板切换版本后,必须点【重启 Nginx】或【重启 Apache】,否则仍跑旧进程
- 确认
display_errors = On和error_reporting = E_ALL在当前 PHP 版本的php.ini里已生效(小皮 → PHP 设置 → 配置文件),并点击「重载配置」 - 检查扩展是否启用:
each()不依赖扩展,但create_function()替换后若用到mbstring、json等,要进小皮「PHP 扩展管理」勾选并重启


















