【问题标题】:switch case isset triggered when case is -not- set当 case 未设置时触发 switch case isset
【发布时间】:2013-04-29 17:30:05
【问题描述】:

--让我补充一下。这段代码按原样对我有用。我只是不知道它为什么起作用。--

我想不通。

switch ($_SERVER['QUERY_STRING']) {
case isset($_GET['test0']):
    echo "test0<br>";
    break;
case isset($_GET['test1']):
    echo "test1<br>";
    break;
case isset($_GET['test2']):
    echo "test2<br>";
    break;
case isset($_GET['test3']):
    echo "test3<br>";
    break;
case isset($_GET['test4']):
    echo "test4<br>";
    break;
default:
    echo "no test<br>";
    break;
}

当url为index.php?test0时,显示“test0”。

当url为index.php?test4时,显示“test4”。

当url为index.php?test999时,显示“no test”。

当url为index.php?tes时,显示“未测试”。

当 url 为 index.php? 或 index.php 时,显示“test0”。

这是为什么?条件不满足,不应该显示默认吗?

【问题讨论】:

  • 你想做什么?如果index.php?test0 是网址?那么,你对switch 有什么回应呢? ...我只是想了解您的问题
  • 好吧,它可以满足我的需要。如果我使用 ?test3,它会回显 test3。如果 ? 条件错误,它会回显默认值。我只是不知道当 url 中没有条件时它会触发第一种情况。
  • 我尝试了我的代码,它可以工作。不过可能有点激进

标签: php get switch-statement


【解决方案1】:

switch 不能这样使用。 isset() 返回 true 或 false,而不是您可以匹配的东西(字符串、int 等)。你基本上在做的是:

switch ($_SERVER['QUERY_STRING']) {
    case true:
        echo "test0<br>";
        break;
    case true:
        echo "test1<br>";
        break;
    case false:
        echo "test2<br>";
        break;
    case false:
        echo "test3<br>";
        break;
    case true:
        echo "test4<br>";
        break;
    default:
        echo "no test<br>";
        break;
}

cases 是从上到下考虑的。在这种情况下,$_SERVER["QUERY_STRING"] 会自动类型转换为 bool(在这种情况下将返回 true)。它看到的第一个案例是 test0,所以它回应了这一点。如果你对 test0-4 这样做,它会给你一种错误的错觉,即这段代码正在按预期工作,而它没有考虑边缘情况。

实现所需的唯一方法是使用多个 if,或重新设计应用程序。

【讨论】:

  • 但它确实有效。如果 url 是 ?test1、?test3 等,它可以工作。如果使用 ?notacase ,则默认启动。我只是想知道如果不使用 ?condition 是如何使用第一种情况的。
  • @JSP254 它实际上不应该匹配任何东西并直接跳转到您提到的任何测试用例的默认值,因为您将字符串匹配到真/假的情况。
  • 我明白你的观点@Timothy。我猜它会触发正确的条件为真,并适当地回声。并且条件是错误的或错误的,它会触发默认值。但我仍然无法弄清楚为什么 url 中没有条件触发第一种情况。我被难住了。
  • 查看数据 ($_SERVER['QUERY_STRING']) 并进行手动检查。
  • 我不明白你的意思
【解决方案2】:

当 url 为 index.php? 或 index.php 时,显示“test0”。

这是为什么?条件不满足,不应该显示默认吗?

就像一个好问题一样,您的问题也已经包含了答案。

您已经意识到即使您认为条件不满足,也必须满足条件。所以你问。那么让我们看看满足哪个条件:

case isset($_GET['test0']):
    echo "test0<br>";
    break;

这是对isset($_GET['test0']) 的测试,我们通过请求知道这是FALSE。所以这个测试测试FALSE

现在让我们看看这个测试:

switch ($_SERVER['QUERY_STRING']) {

那是$_SERVER['QUERY_STRING']。因此,如果$_SERVER['QUERY_STRING']FALSE,则将输出test0

因为 PHP 中的 switch { case:} 进行松散比较,所以空字符串 $_SERVER['QUERY_STRING']FALSE。这就是您看到输出的原因。

如果您知道原因就很容易,对吧?一切都那么合乎逻辑。

你想要测试的不是$_SERVER['QUERY_STRING'],而只是TRUE

switch (TRUE)
{
    case isset($_GET['test0']) :
    ...
}

【讨论】:

    【解决方案3】:

    这也可以完成工作。

    <?php 
    
    $q = $_SERVER['QUERY_STRING'];
    
        if(!empty($q) && isset($q) && strlen($q) >0 ){
            $url = $q;
    
            switch ($url){
               case true;
                 echo $url;
                 break;
                }
            }
    
        else {
        echo "no test<br>";
        }
    

    【讨论】:

      【解决方案4】:

      怎么样

      $found = false;
      for($i=0;$i <=4; $i++){
          if( isset($_GET['test'.$i]) ){
              echo "test".$i;
              $found = true;
          }
      }
      
      if(!$found){
          echo "no test";
      }
      

      【讨论】:

      • 嗯。不确定兄弟。原始代码做了我需要它做的事情。只是想弄清楚原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      相关资源
      最近更新 更多