You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中create_function转匿名函数失效,该如何解决?

解决create_function转匿名函数的问题

先明确你两种写法的错误

  • 第一种写法:闭包外定义$e=null毫无作用,闭包参数$e未设置默认值,调用时仅传$f会触发参数缺失错误;且闭包未捕获外部的$parsed_tpl变量,作用域不匹配。
  • 第二种写法:参数列表里$e=null;多了个多余的逗号,属于语法错误,PHP会直接抛出解析异常。

正确转换方案分两种场景

原create_function本质是通过字符串动态生成函数,匿名函数属于静态语法,需根据$parsed_tpl的类型对应处理:

场景1:$parsed_tpl是直接可用的表达式(非字符串代码)

如果$parsed_tpl已经是PHP可直接执行的表达式(比如计算结果、已定义的变量引用),只需让闭包捕获该变量,同时修正参数语法即可:

return function($f, $e = null) use ($parsed_tpl) {
    return $parsed_tpl;
};

场景2:$parsed_tpl是字符串形式的PHP代码(原create_function的典型场景)

原代码中create_function是将字符串$parsed_tpl作为函数体执行,匿名函数无法直接解析字符串代码,需结合eval实现等效逻辑(注意:eval和create_function存在相同的安全风险,仅在信任$parsed_tpl来源的前提下使用):

return function($f, $e = null) use ($parsed_tpl) {
    return eval("return $parsed_tpl;");
};

比如原create_function中$parsed_tpl是'$f * 2 + ($e ?: 10)'这类字符串,上面的匿名函数就能和原代码实现完全一致的效果。

内容的提问来源于stack exchange,提问作者Randal Burger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:31:12