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,您会看到 foo
和 bar
,还是 foo
和 bar
和 nope
?
【问题讨论】:
你试过运行这段代码吗? 如果没有大小写匹配,则执行默认大小写。 仅供参考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 语句的默认值在它之前有匹配的大小写,它会被评估吗?
在大多数case
s 中它不应该,因为你经常会有break
s 在那里。但是,在您的情况下,它也会转到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)
是评估,而不是值。开关比较参数的值,看它是否等于case
s中的任何一个。
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
语句完全相同。您可以比较值以获得true
或false
。 switch
只是发明的一种便利,因此人们不必键入 100 个 if/else 组合并将代码嵌套到遗忘中。
@buggabill 我不太确定它是否非常可取,但它是有效的。我的观点是,不应该以那种方式使用它除非它完全理解为什么要使用它。
@Matt,一行虽然我不同意。 “除非 $x == 1,否则上述代码的输出将始终为默认值”。这不真实。例如,在比较 $x==($x > 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 默认的主要内容,如果未能解决你的问题,请参考以下文章