【问题标题】:Php Switch Case not working as expectedPhp Switch Case 未按预期工作
【发布时间】:2018-10-05 17:54:28
【问题描述】:

我在一个非常基本的 PHP 脚本中犯了一个非常愚蠢的逻辑错误。

请参阅 u_mulders 答案以获得结论。

脚本访问 $_GET[] 变量,应该只确定该变量是否已设置(非常有效)以及它是否设置为大于 0 的值(这未按预期工作)。

这里是“switch.php”文件:

<?php

if($_GET["variable"]==NULL){
    die('Set $_GET["variable"] to use this Script!');
}

//Create Instance of $_GET["variable"] casted to Integer
$variable = (integer)$_GET["variable"];

//this var_dump displays that the $variable is succesfully casted to an Integer
var_dump($variable);

switch ($variable) {
    case ($variable > 0):
        echo "You entered $variable!";
        break;

    default:        
        echo "Either Your variable is less than 0, or not a Number!";
        break;
}

?>

现在我希望第一个 case-Statement 仅在 $variable 大于 0 时运行。

如果我打开网址,情况并非如此:http://www.someserver.com/switch.php?variable=0

输出如下:

.../switch.php:11:int 0

您输入了 0!

希望你能帮助我。

提前致谢。

【问题讨论】:

  • 只需更改 $variable = (integer)$_GET["variable"];到 $variable = $_GET["variable"];。因为您使用的是显式转换,每次它以 char 形式将变量值更改为整数时
  • 我不建议使用具有不同表达方式的开关。将它用于具有不同值的相同表达式。阅读文档以查看交换机的主要用例。 “switch 语句类似于 同一表达式 上的一系列 IF 语句”。 php.net/manual/en/control-structures.switch.php
  • 我知道您使用 switch 进行值比较,使用 if´s 进行条件比较。我只是想在这里看到我的逻辑错误。

标签: php nginx switch-statement php-7.1


【解决方案1】:

所以,$variable0$variable &gt; 00 &gt; 0false

比较 0false。你得到了什么?当然 - 真的。

将您的 switch 重写为:

// compare not `$variable` but result of some operation with `true`
switch (true) {           
    case ($variable > 0):
        echo "You entered $variable!";
        break;

    default:        
        echo "Either Your variable is less than 0, or not a Number!";
        break;
}

【讨论】:

  • @abrar 这将如何帮助?
  • 是对的。这只是一个愚蠢的逻辑错误。将 0 与 false 进行比较总是正确的。
  • @u_mulder 我认为您应该详细说明Compare 0 and false. What do you get? Of course - true. 否则这个问题是不可理解的。关于 PHP 类型以及为什么 0 == false 可能会有所帮助。
【解决方案2】:

我认为您误解了开关的工作原理。..

switch (VAR-TO-COMPARE){
    case VAL-TO-BE-COMOARED: do something
}

因此,您的脚本中发生的事情是将 $variable 中存储的整数值(在您的示例中为 0)与布尔值进行比较,这是布尔方程 $variable &gt; 0 的结果。 在案例内部,您的整数值被隐式转换为布尔 TRUE 值,因此如果您插入一个数字,您的开关将始终转到开关的第一个案例。

您可以使用 if 语句,这样既可读又高效

if ($variable > 0){
    do something
} else{
    do something else
}

【讨论】:

    【解决方案3】:

    您不能在 switch case 中使用比较运算符。参考php手册。您可以使用 if 语句来执行您要查找的操作。

    if($variable > 0){
      echo "You entered $variable!";
    }else{
      echo "Either Your variable is less than 0, or not a Number!";
    }  
    

    【讨论】:

    • 是的,您可以在 switch/case 中使用比较运算符。你可能不应该,但你可以。
    【解决方案4】:
    switch (true) {
        case ($variable > 0):
            echo "You entered $variable!";
            break;
    
        default:        
            echo "Either Your variable is less than 0, or not a Number!";
            break;
    }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多