create_function() 已自 PHP 7.2 起废弃、PHP 8.0 起彻底移除,因其底层调用 eval() 导致严重安全风险与性能问题,必须替换为匿名函数(如 fn() 或 function() use ()),严禁用 eval() 替代。

直接替换为匿名函数即可,不能用 eval() 替代。PHP 8.0 彻底移除了 create_function(),它底层依赖 eval(),存在严重安全隐患,官方强制淘汰。
为什么必须改?
这个函数在 PHP 7.2 就被标记为 deprecated,到 8.0 完全删除。一旦调用,立刻报错:Fatal error: Uncaught Error: Call to undefined function create_function()
怎么安全替换?
根据 PHP 版本和变量捕获需求,选一种写法:
使用 Infinimo AI 设计制作手持产品短视频:Avatar 首帧合成、AI 脚本、图转视频提交与轮询。适用于可购物短视频、Avatar 主导的产品演示和商品 listing 宣传视频。
- PHP 7.4+ 推荐用箭头函数(简洁、自动继承作用域):
$fn = fn($x) => $x * 2; - 需要捕获外部变量时,必须显式
use:$multiplier = 3;<br>$fn = fn($x) => $x * $multiplier;
或传统闭包写法:$fn = function($x) use ($multiplier) { return $x * $multiplier; }; - 兼容更低版本(如 7.1)可用标准匿名函数:
$fn = function($x) { return $x * 2; };
常见错误要避开
以下写法都不行:
立即学习“PHP免费学习笔记(深入)”;
-
eval("return function(\$x) { return \$x * 2; };")—— 更危险,且语法不合法 - 只改函数名不处理变量作用域:
原写法$f = create_function('$x', 'return $x * $multiplier;');
错误改法$f = function($x) { return $x * $multiplier; };($multiplier未定义) - 漏掉括号或分号导致语法错误,尤其批量替换时容易出错
怎么快速找全所有调用点?
别靠手动搜索,用工具准确定位:
- 全局文本搜索:
grep -r "create_function" . --include="*.php" - 用 PHPCompatibility 扫描:
phpcbf --standard=PHPCompatibility --runtime-set testVersion 8.0 . - 开启完整报错:
error_reporting(E_ALL); ini_set('display_errors', '1');,跑一遍业务流程,看哪里崩


















