PHP开关案例-有缺陷或有效


PHP switch case - flawed or valid?

我不明白为什么switch-case statement需要在每个case之后显式插入break一旦生成case,它的全部意义不就是停止吗

有人能给我一个case被发现为true的情况吗?但由于某种原因[你在这里插入原因],你仍然需要代码块来执行。

这是一个有效PHP switch-case statement

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


这是入侵PHP switch-case statement

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


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

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

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

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

我相信这个问题与这个问题重复,@Micahel Burr:有力地回答了这个问题

许多答案似乎都集中在失败的能力上,这是要求中断陈述的原因。

我相信这只是一个错误,主要是因为当C设计时,对这些将使用构造。

彼得·范德林登在他的著作《专家C》中提出了这一观点编程":

我们分析了Sun C编译器的源代码,以了解默认使用了跌倒。Sun ANSI C编译器前端有244switch语句,每个语句平均有七种情况。落下在所有这些病例中,只有3%的病例发生了穿透。

换句话说,正常的开关行为在97%的情况下是错误的。这不仅仅是在编译器中——相反,失败在哪里在这种分析中,它通常用于发生次数更多的情况在编译器中比在其他软件中更频繁,例如,当编译可以有一个或两个操作数的运算符:

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

案例失败被广泛认为是一个缺陷甚至还有一个特殊的评论惯例,如上所示告诉《lint》,这确实是3%的病例之一是理想的。"

我认为C#需要显式跳转是个好主意每个case块末尾的语句(同时仍然允许多个箱子标签要堆叠-只要只有一块语句)。在C#中,你仍然可以从一个案例转到另一个案例-你只需要通过使用goto跳到下一个案例来明确失败。

Java没有抓住机会从C语义。

它也用于组合条件。

举一个有点无用的例子:

// 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通常只是出于文体原因而被使用)。

一个语句可以携带多个事例标签,如下例所示,我们不使用break:

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

在本例中,如果常量表达式等于"a"answers"f"之间的任何字母,则调用hexcvt函数。