1

――付け加えさせてください。このコードはそのままで機能します。なぜそれが機能するのかわかりません.--

私はこれを理解することはできません。

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の場合、「テストなし」と表示されます。

URLがindex.php?tesの場合、「no test」と表示されます。

URLがindex.php?、index.phpの場合、「test0」が表示されます。

どうしてこれなの?条件が満たされていないので、デフォルトは表示されませんか?

4

4 に答える 4

2

switchこのままでは使えません。isset()照合できるもの (文字列、int など) ではなく、true または false を返します。あなたが基本的にやっていることは次のとおりです。

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 を使用するか、アプリケーションを再設計することです。

于 2013-04-29T17:32:50.150 に答える
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'] れます。FALSEtest0

switch { case:}PHP では緩やかな比較を行うため、空の文字列$_SERVER['QUERY_STRING']FALSE. これが、出力が表示される理由です。

理由がわかれば簡単ですよね?そして、すべてとても論理的です。

そして、あなたがテストしたかったのは、次のこと$_SERVER['QUERY_STRING']だけではありませんでしたTRUE

switch (TRUE)
{
    case isset($_GET['test0']) :
    ...
}
于 2013-04-29T18:58:10.093 に答える
0

どうですか

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

if(!$found){
    echo "no test";
}
于 2013-04-29T17:58:56.910 に答える