create_function()自php 7.2起被废弃、php 8.0正式移除,因其内部调用eval()导致代码注入风险及性能问题,应改用匿名函数或箭头函数替代。

create_function() 在 PHP 7.2 中被废弃,PHP 8.0 正式移除。它因安全风险(如代码注入)和性能问题被淘汰,推荐用匿名函数(闭包)替代。
用匿名函数直接替换
最常见场景是回调函数,比如 array_map、usort、preg_replace_callback 等:
- 旧写法:
array_map(create_function('$n', 'return $n * 2;'), [1,2,3]); - 新写法:
array_map(fn($n) => $n * 2, [1,2,3]);(PHP 7.4+ 箭头函数) - 或兼容更低版本:
array_map(function($n) { return $n * 2; }, [1,2,3]);
动态生成逻辑?改用可调用对象或预定义函数
如果原逻辑依赖字符串拼接生成代码(例如根据配置动态构造函数),不要拼接 PHP 代码执行——这极不安全。应改为:
- 用 switch 或 map 数组 映射规则到已有函数
- 封装成类方法,通过方法名反射调用(
[$obj, $method]) - 使用 eval() 是最后手段,且必须确保输入完全可控——不推荐
处理正则回调中的动态逻辑
比如 preg_replace_callback 原用 create_function 构造回调:
- 旧:
preg_replace_callback('/\d+/', create_function('$m', 'return "[" . $m[0] . "]";'), $str) - 新:
preg_replace_callback('/\d+/', fn($m) => "[" . $m[0] . "]", $str) - 若需复用,提前定义函数:
$wrap = fn($m) => "[" . $m[0] . "]"; preg_replace_callback(..., $wrap, $str);
检查第三方库是否受影响
老旧扩展或框架(如早期 ThinkPHP、CodeIgniter 插件)可能仍调用 create_function。升级时注意:
- 查看报错信息定位具体文件和行号
- 优先升级库到支持 PHP 7.2+ 的版本
- 临时兼容可加判断:
if (function_exists('create_function')) { ... },但仅作过渡,不可长期保留
不复杂但容易忽略











