PHP switch case 默认

Posted

技术标签:

【中文标题】PHP switch case 默认【英文标题】:PHP switch case default 【发布时间】:2012-08-10 14:48:12 【问题描述】:

如果 switch 语句的默认值在它之前有匹配的大小写,它会被评估吗?

例如:

switch ($x) 
  case ($x > 5): print "foo";
  case ($x%2 == 0): print "bar";
  default: print "nope";

所以对于 x = 50,您会看到 foobar,还是 foobarnope

【问题讨论】:

你试过运行这段代码吗? 如果没有大小写匹配,则执行默认大小写。 仅供参考 case ($x > 5) 评估为 case 1:case true: 如果没有break,您的代码将尝试匹配所有条件。使用break,它将在第一场比赛中停止。 在您的代码中不中断,它将执行第一个匹配的案例以及之后的每个案例。 【参考方案1】:

是的,如果没有“break”,那么第一个匹配的case之后的所有动作都会被执行。控制流将“遍历”所有后续case,并执行每个后续case 下的所有操作,直到遇到break; 语句,或直到到达switch 语句的末尾。

在您的示例中,如果 $x 的值为 50,您实际上会看到 "nope"

请注意,switch 实际上是在 switch 关键字后面的表达式和 case 关键字后面的每个表达式之间执行简单的相等测试。

您的示例很不寻常,因为它只会在 $x 的值为 0 时显示 "foo"。(实际上,当 $x 的值为 0 时,您会看到“foo bar nope”。 )

评估case 关键字后面的表达式,在您的情况下,示例返回 0(如果条件测试为假)或 1(如果条件测试为真)。 switch 将与 $x 进行比较的值(0 或 1)。

【讨论】:

【参考方案2】:

如果 switch 语句的默认值在它之前有匹配的大小写,它会被评估吗?

在大多数cases 中它不应该,因为你经常会有breaks 在那里。但是,在您的情况下,它也会转到default

另外请尽量避免做那些单行的东西(为了可读性):

$x = 10;

switch (true) 
  case ($x > 5):
      print "foo";

  case ($x%2 == 0):
      print "bar";

  default:
      print "nope";

将打印foobarnope。所以回答你的问题:是的:-)

【讨论】:

打印foobarnope。只要任何情况为真,所有后续情况,包括默认情况,直到中断(或切换结束)都将运行。 codepad.viper-7.com/sjHYeZ【参考方案3】:

这不是开关的工作方式。

According to the manual:

switch 语句类似于一系列 IF 语句 相同的表达。在许多情况下,您可能想比较相同的 具有许多不同值的变量(或表达式),并执行 不同的代码取决于它等于哪个值。这是 正是 switch 语句的用途。

类似的评价

case ($x > 5):

就等于

case true:

case false:

取决于$x 的值,因为($x > 5)评估,而不是。开关比较参数的值,看它是否等于cases中的任何一个。

switch($x) 
    case ($x > 5): // $x == ($x > 5)
        echo "foo";
        break;
    case ($x <= 5): // $x == ($x <= 5)
        echo "bar"
        break;
    default:
        echo "default";
        break;

上面代码中的比较等价于

if ($x == ($x > 5)) 
    echo "foo";
 elseif ($x == ($x < 5)) 
    echo "bar";
 else 
    echo "five";

其中($x == 50 时)等价于

if ($x == true) 
    echo "foo";
 elseif ($x == false) 
    echo "bar";
 else 
    echo "five";

相当于

if (true)  // $x == true is the same as saying "$x is truthy"
    echo "foo";
 elseif (false) 
    echo "bar";
 else 
    echo "five";

IF,但是,您使用了您的 switch 语句,因为它打算被使用(将参数与具体值进行比较):

switch ($x) 
    case 50:
        echo "foo ";
    case 30:
        echo "bar ";
    default:
        echo "foo-bar";

$x == 50,你的输出将是

foo bar foo-bar

因为您的案例中没有break

如果您将 break 关键字添加到每个案例的末尾,您将只执行该特定案例的代码。

switch ($x) 
    case 50:
        echo "foo ";
        break;
    case 30:
        echo "bar ";
        break;
    default:
        echo "foo-bar";
        break;

输出:

foo 

【讨论】:

不,你没有。读你写的。你说你不能“像那样”使用开关,你错了——你可以,没有什么能阻止任何人这样做。发表一个半正确的答案是可怕的,有人会走进来读你写的东西,并认为你是对的,而实际上你不是。 OP 的 switch 语句完全有效。在案例中进行评估是完全有效且非常理想的代码。您的回答仅显示了该语句的一种用法。 @Matt - 你试图解释的逻辑背后没有错,错在你对switch 声明的解释。 Switch 语句的行为与if 语句完全相同。您可以比较值以获得truefalseswitch 只是发明的一种便利,因此人们不必键入 100 个 if/else 组合并将代码嵌套到遗忘中。 @buggabill 我不太确定它是否非常可取,但它是有效的。我的观点是,不应该以那种方式使用它除非它完全理解为什么要使用它。 @Matt,一行虽然我不同意。 “除非 $x == 1,否则上述代码的输出将始终为默认值”。这不真实。例如,在比较 $x==($x &gt; 5) 中,有一个 $x 到布尔值的隐式转换,只要 $x!=0,它就会评估为真。如果$x=0,则该语句将实际返回true,因为$x 将为false,$x>5 为false,因此您得到false==false。如果 $x=1 到 5,则该语句返回 false,因为任何非 0 数字都将转换为布尔值 true。所以语句变为true==false。任何大于 5 的数字都将返回 true true == true【参考方案4】:

自己尝试会更容易。

但是无论如何,如果你不在一个case中使用break,它后面的所有case都会被执行(包括默认的)。

【讨论】:

确实,除了***之外还有其他地方可以找出问题的答案,但是当我们这样做时,没有人可以收集代表;-)

以上是关于PHP switch case 默认的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本 | Switch Case 仅选择默认选项

Js分支结构 switch--case

go的switch case

php switch case 问题

Python里怎么实现switch case

switch选择结构