情况未设置时触发开关情况

时间:2013-04-29 17:30:05

标签: php get switch-statement

- 让我补充一下。这段代码对我来说就是这样的。我只是不知道它为什么会起作用.--

我无法解决这个问题。

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时,&#34; test0&#34;显示。

当url是index.php?test4时,&#34; test4&#34;显示。

当url是index.php?test999时,&#34;没有测试&#34;显示。

当网址是index.php?tes时,&#34;没有测试&#34;显示。

当url是index.php?或index.php时,&#34; test0&#34;显示。

这是为什么?条件不满足,默认情况下是否应该显示?

4 个答案:

答案 0 :(得分:2)

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;
}

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

实现目标的唯一方法是使用多个ifs,或重新设计应用程序。

答案 1 :(得分:1)

  

当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']) :
    ...
}

答案 2 :(得分:0)

怎么样

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

if(!$found){
    echo "no test";
}

答案 3 :(得分:0)

这也完成了工作。

<?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>";
    }