PHP切换案例 - 有缺陷或有效?

时间:2013-11-21 05:09:38

标签: php switch-statement

我不明白为什么switch-case statement要求您在每个break后明确插入case一旦case成立,它的全部意义不是停止吗?

有人可以给我一个找到case true的情况但由于某种原因[你在这里插入原因],你仍然需要代码块来执行。

这是 vaild PHP switch-case statement

   switch ($error) {
    case 'empty':
        $msg = 'Field cannot be empty.';
        break; 
    case 'invalid':
        $msg = "Field may only contain number.";
        break;
    }


这是 invaild PHP switch-case statement

   switch ($error) {
    case 'empty':
        $msg = 'Field cannot be empty.';
    case 'invalid':
        $msg = "Field may only contain number.";
    }


那么这个break是无用的还是在某些情况下它有用呢?

4 个答案:

答案 0 :(得分:5)

因为这就是它的工作方式 - 这就是语言的设计方式。可能是因为C就是这样做的。

最常见的用途是对两个case进行相同的处理。

switch ($error) {
   // Treat warnings and errors the same
   case 'warning':
   case 'error':
      echo "Something went wrong.";
      break;
}

答案 1 :(得分:0)

我认为这个问题与此问题重复,@Micahel Burr强烈回答:

  
    

许多答案似乎都集中在作为要求破坏声明的理由的能力上。

  
     

我认为这只是一个错误,主要是因为当C是   设计的那些经验并没有那么多   将使用构造。

     

彼得范德林登在他的书“专家C”中提到了这个案子   编程“:

     

我们分析了Sun C编译器源,看看默认的频率   通过使用了。 Sun ANSI C编译器前端有244个   switch语句,每个语句平均有七个案例。秋季   在所有这些案件中仅占3%。

     

换句话说,正常的开关行为在97%的时间是错误的。   它不仅仅是在编译器中 - 恰恰相反,它是在堕落的地方   在此分析中使用的情况通常是出现更多情况   经常在编译器中而不是在其他软件中,例如,何时   编译可以有一个或两个操作数的运算符:

switch (operator->num_of_operands) {
     case 2: process_operand( operator->operand_2);
               /* FALLTHRU */

     case 1: process_operand( operator->operand_1);
     break; } 
  

案件失败被广泛认为是一种缺陷   甚至是上面显示的特殊评论惯例   告诉皮特“这实际上是3%的情况之一   很理想。“

     

我认为C#需要一个明确的跳转是一个好主意   每个案例块末尾的陈述(同时仍然允许多个   要堆叠的案例标签 - 只要只有一个块   语句)。在C#中你仍然可以让一个案例落到另一个案例中    - 你只需要通过使用goto跳转到下一个案例来明确表达。

     

糟糕的是,Java并没有抓住机会从C中脱颖而出   语义。

答案 2 :(得分:0)

它也用于组合条件。

给出一个无用的例子:

// manually total up a number by 1
$sum = 0;

switch ($number) {

    case 4:
       $sum += 1;
    case 3:
       $sum += 1;
    case 2:
       $sum += 1;
    case 1:
       $sum += 1;
}

这将switch设置为独占if树,因为一个案例可以是另一个案例的超集,并减少代码重复。如果您的所有案例都包含break,那么您当然可以将其转换为if列表。 (switch通常只是出于文体原因而使用。)

答案 3 :(得分:0)

单个语句可以包含多个案例标签,因为以下示例显示了我们未使用break的位置:

switch($constant)
{
    case 'a' :
    case 'b' :
    case 'c' :
    case 'd' :
    case 'e' :
    case 'f' :  hexcvt(c);
}

在这个例子中,如果constant-expression等于'a'和'f'之间的任何字母,则调用hexcvt函数。