PHP中匿名函数能否与NULL合并运算符配合使用?
问题本质
PHP的??空合并运算符的运行逻辑是:当左侧操作数存在且不为null时直接返回左侧值,否则原样返回右侧表达式的求值结果,不会自动识别右侧是不是可调用对象、更不会自动执行。
你代码里右侧写的(function () { return 'z'; })本身的求值结果就是一个Closure闭包实例,所以最终拿到的自然是闭包对象,而不是闭包执行后的返回值。
正确写法
根据场景不同可以选以下几种实现方式:
- 简单默认值场景:如果默认值是固定值、不需要复杂计算,直接把值写在右侧即可,不需要套匿名函数
$a = [0 => 'x']; $value = $a[1] ?? 'z'; - 复杂默认值+立即执行场景:如果默认值需要经过复杂逻辑计算,只想在左侧值不存在时才执行计算逻辑,可以给匿名函数加括号做立即执行(PHP 7.0+版本支持)
$a = [0 => 'x']; $value = $a[1] ?? (function () { // 这里可以放耗时计算、IO读取等逻辑,只有$a[1]不存在时才会执行 return 'z'; })(); - 逻辑复用场景:如果默认值生成逻辑需要在多处使用,可以提前把闭包存到变量里,判空后再手动调用
$defaultBuilder = function () { return 'z'; }; $a = [0 => 'x']; $value = isset($a[1]) ? $a[1] : $defaultBuilder();
注意:空合并运算符是语法结构,不是函数,不会对右侧参数做任何特殊处理,不要期待它自动执行闭包、或者做额外的类型转换。
内容的提问来源于stack exchange,提问作者JAyenGreen
相关产品推荐
相关产品推荐

