是否存在速记切换语句(在PHP中)?

时间:2014-09-26 14:45:47

标签: php switch-statement shorthand

我想将相同的变量(或表达式)与许多不同的值进行比较,并根据它所等的值返回不同的值。我希望inline or shorthand执行此操作,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 =,并希望用更少的代码找到一种方法。

我可以用某种形式的速记语法来做。下面,我使用shorthand if statement为变量首先被声明的位置赋值:

$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
        )
    );

此方法不需要在每个构造中声明变量,而是给我2个新问题:

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

我的问题:是否有一种方法允许我使用行为类似于开关的简写语法直接为变量赋值?

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

1 个答案:

答案 0 :(得分:5)

工作太多了。使用调度表。

$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);
}