PHP开关语句问题

4
我正在尝试表达的是$level > -100 && $level < 100
$level  = 0;

                switch($level){                                                                                       

                case $level > -100:                                                                                   
                break;
                case $level <  100:                                                                                   
                break;
                default:
                echo '5';
                return null;                                                                                          
                }              

你可以像这样使用 switch 语句。

检查我的答案。使用Switch是可能的。但是我必须告诉你,这不是Switch的良好使用方式。 - Starx
请看我对nikic答案的评论。 - Mchl
我不明白提议的 switch 结构如何近似于 (($level > -100) && ($level < 100))。你有三种情况,第一种情况捕获 -99,第二种情况捕获 -110,第三种情况(默认)从未被调用。 - Peter
7个回答

6

到目前为止,所提供的答案都没有明确地将原始问题的精神与适当的开关结构相连接。因此,记录一下:

switch (true) {
    case (($level>-100) && ($level<100)):
        echo 'in range one';
        break;
    case (($level>200) && ($level<300)):
        echo 'in range two';
        break;
    default:
        echo 'out of range';
}

这个switch语句的使用没有任何问题。

你忘记加break语句了吗? - Ngob
是的,我确实做了!谢谢,我已经添加了它们。 - Peter

4

当你使用 switch ($level) 时,你已经在比较 $level 的值。每个 case 只能检查相等性,不能像你的例子中那样进行比较。你需要使用一个 if 语句代替:

if ($level > -100 && $level < 100)
  ; // do nothing; equivalent of break in this case
else
  echo '5';

更简单的方法是,只需否定条件:
if ($level <= -100 || $level >= 100)
  echo '5';

4
除了if/else之外,还有另一种方法:
switch (true)                                                                               
    case $level > -100:
        break;
    case $level <  100:
        break;
    default:
        echo '5';
        return null;
}

1
这并不完全等同于$level > -100 && $level < 100。考虑$level = -200。它不会在第一个情况下中断,但会在第二个情况下中断。实际上,echo 5;行将永远不会被执行到。 - Mchl
@Mchl - 你说得对,但实际上这是原问题中的一个错误。NikiC的答案在语法上是正确的,也很可能是提问者想要做的事情。 - Peter

2
其他答案在某种程度上都是正确和错误的。错误的是,使用PHP是可以实现你想要的功能的... 只需要将 switch($level) 改为 switch(true) ,你的示例就能正常工作。正确的是,这不好,如果其他程序员看到你的代码会把你揍一顿。这不是 switch 语句的本意,并且在大多数其他语言中也不能这样使用。

3
我认为这很有趣。你可以将开关设为true并对其进行评估,这显然是有意为之的。当你思考它时,它也是完全合理的。但我不会称它为直观的。不幸的是,它似乎导致了猛禽从天而降的情况。 - Tegra Detra
我不同意在PHP中使用switch(true)是一种不好的形式。确实有一些其他语言(如Java)不支持switch(true)语法。但是许多语言都支持类似的结构(包括Perl、Groovy和Go),因此你不能真正地认为“没有人这样做,所以你也不应该这样做”。我认为,当正确使用时,它实际上可以使PHP代码至少与if/then else链一样易于阅读。 - Peter

0

不行,Switch 仅支持“等于”类型的比较。


0
不行,你不能这样做。在 case 块中,switch 语句需要字面值。可以改用 if 语句代替:

if(!($level > -100 && $level < 100))
{
  echo '5';
  return null;
}

级别怎么可能小于-100或大于100呢? - David_001

-3
这是人们认为caseif-else更优越的原因之一,但我不喜欢它的语法和限制 - if-ifelse-else更加实用。

这并没有帮助到问题。 - Femaref
两者并没有“优劣之分”;它们各有其用途。在这种情况下,一个 if 语句胜出。 - casablanca
我的苹果可以打败你的橙子。 - Tegra Detra
这只是一个争论论点。两种说法都有其优点。 - Femaref
我说过“我不喜欢”,这显然是一个观点。我想我的回答应该留作评论,抱歉。事实上,“switch”更加有限,并且它的语法与其他控制结构不同,包括常被忽视的“break”(可能会引起问题)。比较控制结构并不是在比较苹果和橙子。总体而言,“if”显然更加优越,因为它可以做同样的事情,而且还可以做更多的事情。我想看看你能否完全不使用其中的任何一个。 - Mark Snidovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接