PHP中create_function创建的闭包无输出,是否存在语法问题?
问题分析与解决
核心问题:
create_function返回的是临时生成的函数名字符串(如lambda_1),但function_exists()仅检测全局命名函数是否存在,闭包/匿名函数不属于这个范畴,所以你的tagWrap函数里的判断会返回false,导致无输出。修复方案:
- 把判断条件从
function_exists($func)改成is_callable($func),is_callable()可以识别所有可调用类型,包括闭包、函数名字符串、对象方法等。 - 注意:
create_function在PHP7.2已被废弃,PHP8.0直接移除,现在建议用原生闭包语法,兼容性和可读性都更好。
- 把判断条件从
示例代码修改
原来的代码(无输出):
function tagWrap($text, $func = null) { if (function_exists($func)) { echo $func($text); } } // 使用create_function的调用 $underlineFunc = create_function('$t', 'return "<u>$t</u>";'); tagWrap('测试文本', $underlineFunc);
修改后(正常输出):
function tagWrap($text, $func = null) { if (is_callable($func)) { echo $func($text); } } // 推荐的原生闭包写法 $underlineFunc = function($t) { return "<u>$t</u>"; }; tagWrap('测试文本', $underlineFunc);
内容的提问来源于stack exchange,提问作者Anacardo
相关产品推荐
相关产品推荐

