44

実際にswitchステートメントでキーワードを使用できることに気づきcontinueましたが、PHPでは期待どおりに機能しません。

PHPで失敗した場合、他にいくつの言語でも失敗することを誰が知っていますか?言語を頻繁に切り替える場合、コードが期待どおりに動作しないと、これが問題になる可能性があります。

continueそれでは、switchステートメントでの使用を避けるべきですか?

PHP(5.2.17)が失敗します:

for($p = 0; $p < 8; $p++){
    switch($p){
        case 5:
            print"($p)";
            continue;
            print"*"; // just for testing...
        break;
        case 6:
            print"($p)";
            continue;
            print"*";
        break;
    }
    print"$p\r\n";
}
/*
Output:
0
1
2
3
4
(5)5
(6)6
7
*/

C ++は期待どおりに機能しているようです(forループの最後にジャンプします):

for(int p = 0; p < 8; p++){
    switch(p){
        case 5:
            cout << "(" << p << ")";
            continue;
            cout << "*"; // just for testing...
        break;
        case 6:
            cout << "(" << p << ")";
            continue;
            cout << "*";
        break;
    }
    cout << p << "\r\n";
}
/*
Output:
0
1
2
3
4
(5)(6)7
*/
4

7 に答える 7

80

continue 2switchステートメントを囲むループの次の反復に進むためにを使用してみてください。

編集:

    $foo = 'Hello';

    for ($p = 0; $p < 8; $p++) {
         switch($p) {
             case 3:
                 if ($foo === 'Hello') {
                     echo $foo;
                     break;
                 } else {
                      continue 2;
                 }

             default:
                 echo "Sleeping...<br>";
                 continue 2;

         }

         echo "World!";
         break;
    }

//This will print: Sleeping... Sleeping... Sleeping... Hello World!

于 2012-10-22T14:13:19.187 に答える
48

PHP 7.3以降:

continueステートメントを中断するために使用することswitchは非推奨であり、警告がトリガーされます。

switchステートメントを終了するには、を使用しますbreak

switch現在のステートメントを囲むループの次の反復に進むには、を使用しますcontinue 2

PHP 7.2以前:

continuePHPのステートメントでは同じ意味でbreak使用できます。switch

于 2012-09-10T10:35:10.367 に答える
7

PHPcontinueステートメントのドキュメントは、これを明確にしています。

注: PHPでは、switchステートメントはcontinueの目的でループ構造と見なされることに注意してください。

言語が異なれば、同じキーワードの意味も微妙に異なることを知っておく必要がありますcontinue。PHPがC++と同じように動作するとは限りませんcontinue

C ++では機能しないcontinuePHPで意味がある場合は、それを使用してください。switch

PHPでは機能しないcontinueC++で意味がある場合は、それを使用してください。switch

于 2012-09-10T10:36:57.923 に答える
2

PHPマニュアルで警告されているように:

「PHPでは、switchステートメントは続行の目的でループ構造と見なされることに注意してください。」

したがって、continueを使用すると、forループではなく、switchステートメントから抜け出します。言語間で同様の構文を想定することの危険。

于 2012-09-10T10:35:26.340 に答える
1

ステートメントがループ内にネストされている場合は、同じように動作continuebreakないことに注意することが重要です。switchステートメントを使用してswitch何かを評価していて、条件が満たされた場合にループ内の次の項目に移動したい場合は、を使用する必要がありますcontinue 2。この場合に使用すると、ループbreak 2全体が中断されますが、これは望ましいアクションではない可能性があります。for

于 2014-08-21T22:26:41.477 に答える
0

ループに埋め込まれているC++switch / case構造内でcontinueを使用しても、まったく問題ありません。他のプログラミング言語で発生する誤動作のために、C++でスタイルを制限するべきではありません。

于 2012-09-10T10:35:29.510 に答える
0

CおよびC++では、switchステートメントはif/else ifとlabels /の派手な組み合わせにすぎないため、 insidegotoを使用しても問題ありません。しかし、お気づきのように、CやC++にた他の言語では期待どおりの動作をしません。これは、構文に関してのみ類似しているためです。セマンティックルールの場合、それらは非常に異なる獣です。したがって、ある言語で機能するものは、たとえ言語が似ていても、別の言語では機能しないことは間違いありません。continueswitch

于 2012-09-10T10:37:50.220 に答える