能否在PHP中结合match语句与数组解构实现函数式风格模式匹配?
用match表达式实现数组长度校验与元素提取
期望的代码(无法运行):
$bar = match (foo()) { [] => throw Exception, [, ] => throw Exception, [$x] => $x, };
需求说明
判断foo()返回的数组是否恰好包含一个元素:
- 是则将该元素赋值给
$bar - 否则抛出异常
当前代码报错原因:
[, ]属于空元素数组语法,PHP不允许- 模式中的
$x未定义,match模式不支持在匹配时定义变量并提取值
可行实现方式
方式1:结合count与match表达式(最贴近需求风格)
$bar = match (count($arr = foo())) { // 长度为0或2及以上时抛出异常 0, 2 => throw new Exception('数组长度不符合要求'), // 长度为1时返回唯一元素 1 => $arr[0], };
这里先把foo()的返回值存到$arr,再用count()获取长度作为match的匹配值,既满足逻辑又符合函数式风格的简洁性。
方式2:解构赋值+条件判断(兼顾解构需求)
如果想利用数组解构的语法,可以配合简单的条件:
$arr = foo(); if (count($arr) !== 1) { throw new Exception('数组长度不符合要求'); } [$bar] = $arr;
这种写法也能实现需求,且解构语法直观。
内容的提问来源于stack exchange,提问作者user_51
相关产品推荐
相关产品推荐

