是否存在简写开关语句(在PHP中)


Do shorthand switch statements exist (in PHP)?

我想将同一个变量(或表达式)与许多不同的值进行比较,并根据它的值返回不同的值。我想像if语句一样,以内联或简写的方式执行此操作。

采用以下switch语句:

switch($color_name) {
    case 'red':
    case 'blue':
        $color_type = handlePrimaryColor($in);
        break;
    case 'yellow':
    case 'cyan':
        $color_type = handleSecondaryColor($in);
        break;
    case 'azure':
    case 'violet':
        $color_type = handleTertiaryColor($in);
        break;
    default:
        $color_type = null;
        break;
}

我不喜欢在任何情况下都编写$color_type =,我想找到一种用更少代码实现这一点的方法。

我可以用某种形式的简写语法来完成。下面,我使用一个简写的if语句在第一次声明变量的同一位置为其赋值:

$color_type = $color_name == 'red' || $color_name == 'blue'
    ? handlePrimaryColor($color_name)
    : ($color_name == 'yellow' || $color_name == 'cyan'
        ? handleSecondaryColor($color_name)
        : ($color_name == 'azure' || $color_name == 'violet'
            ? handleTertiaryColor($color_name)
            : null
        )
    );

这个方法不需要在每个构造中声明变量,而是给我带来了两个新问题:

  • 我现在必须为每种颜色编写一个新的OR条件
  • 每一组条件都会增加额外的嵌套级别

我的问题是:有没有一种方法可以让我使用类似开关的简写语法直接为变量赋值?

如果没有,我会有兴趣了解为什么存在这种限制。

自PHP 8.0以来,有一个简写开关可用,称为match

$colorType = match($color) {
    'red', 'blue' => handlePrimaryColor($in),
    'yellow', 'cyan' => handleSecondaryColor($in),
    'azure', 'violet' => handleTertiaryColor($in),
    default => null
};

工作量太大。使用调度表。

$color_dispatch = Array(
  'red' => 'handlePrimaryColor',
  'blue' => 'handlePrimaryColor',
   ...
);
$color_type = null;
if (array_key_exists($color_name, $color_dispatch))
{
  $color_type = $color_dispatch[$color_name]($in);
}