PHP match匹配分支使用闭包获取执行结果的方法
核心原因
match 表达式会把每个分支右侧的求值结果,直接作为整个match的返回值赋值给$foo:
condition_1分支右侧是字符串字面量,求值后直接得到目标文本,因此运行效果符合预期condition_2分支右侧只是闭包的定义表达式,仅完成了闭包实例的创建,没有发起执行调用,因此最终$foo存储的是闭包对象本身,而非闭包执行后的返回值
具体实现方法
方案1:在match分支内直接立即执行闭包(推荐)
如果明确condition_2分支不需要保留闭包实例,只需要拿到执行结果,直接将闭包定义用括号包裹后紧跟调用括号,让match直接获取闭包执行后的返回值即可。PHP 7.0及以上版本原生支持这种立即执行匿名函数的语法,最终赋值给$foo的内容类型会和condition_1分支的返回值完全统一,不需要额外做类型兼容:
$foo = match ($conditions) { 'condition_1' => 'some text', 'condition_2' => (function () { $result = ''; // 业务逻辑代码 return $result; })() // 此处直接调用闭包,执行结果将作为分支返回值 };
如果闭包需要引用外部作用域的变量,正常在函数定义中补充use声明即可,不影响执行:
// 示例:闭包引用外部的 $userId 变量 'condition_2' => (function () use ($userId) { $result = ''; // 基于$userId的业务逻辑 return $result; })()
方案2:匹配后统一判断类型再执行
如果后续可能新增多个返回闭包的分支,或者有逻辑需要先拿到原始匹配结果再做处理,可以在match执行完成后判断结果类型,对闭包类型的值发起调用:
$matchedResult = match ($conditions) { 'condition_1' => 'some text', 'condition_2' => function () { $result = ''; // 业务逻辑代码 return $result; } }; // 对匹配结果做类型判断:是闭包就执行拿返回值,其他类型直接使用 $foo = $matchedResult instanceof Closure ? $matchedResult() : $matchedResult;
内容的提问来源于stack exchange,提问作者Niwo
相关产品推荐
相关产品推荐

