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
相关产品推荐
相关产品推荐

