phpのコードを書いていて、
foreach(for)構文とswitch構文を組み合わせた際、
以下の様なWarningが出た。
本記事では、上記文言が出力される原因や、対処法を紹介する。
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の原因
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? が出る原因は、switch構文の中でcontinueを使用しているからである。

switch構文のcontinueは、breakと同等
phpにおいて、switch構文の中でのcontinueは、breakと同等の意味を持つので注意しよう。
つまりぶっちゃけ以下のようなコードも、本来のbreakと同じ意味を持つのである。
<?php
$list = array('a','b');
foreach($list as $value) {
switch($value) {
case 'a':
continue; // breakと一緒
case 'b':
continue; // breakと一緒
}
}
おそらく本記事にたどり着いた方は、上記のように
switch構文の中でcontinueを使用してしまっているのではないだろうか。
switch構文でcontinueを使ってしまう状況
そして、switch構文の中でcontinueを使うような状況と言うのは、
そのswitch構文を、さらにforeach構文なんかでラップしていると言う状況であることがほとんだ。
どう言うことかと言うと次のような例を見て欲しい
<?php
$list = array('a','b','c');
foreach($list as $value) {
switch($value) {
case 'a':
break;
case 'b':
continue; // bはスキップ(のつもり)
case 'c':
break;
}
echo $value; // aとcのみechoされる(のつもり)
}
わざと間違えているが、
「’a’,’b’,’c’のうち、’b’の場合はforeach構文をcontinueでスキップし、aとcのみechoしようとしている」例文である。
しかし実際には、上記を実行すると、
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? が表示されてしまう。
これは、bのcaseでcontinueしている部分は、foreachをcontinueしているのではなく、aとc同様、switch構文をbreakしているのと同じ扱いになってしまうため、上記の文言が出力されてしまうのである。
上記を踏まえて、Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の対処法
上記を踏まえて、
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の対処法は、下記の例のように、
continueの後に、スキップさせたいループ処理までの距離を書けばOKだ。
スキップさせたいループ処理までの距離が何かと言うと、
上記で言うと、各ループ処理までの距離の間隔は以下の様になる。
switch文:距離 1
foreach文:距離 2

見て分かる通り、
現在のループ処理の居場所を1として、そこから何個ループ処理でラップされてるかを数えていけば良い。なので、上記の例では、「continue 2」と書くのが正解となる。
<?php
$list = array('a','b','c');
foreach($list as $value) {
switch($value) {
case 'a':
break;
case 'b':
continue 2; // foreach(距離は2)をcontinueする
case 'c':
break;
}
echo $value;
}
注意点としては、
switchもループとして換算することだ。
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の原因と対処法まとめ
では最後にまとめて終了
- Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? が出る原因は、switch構文の中でcontinueを使用しているから
- phpにおいて、switch構文の中でのcontinueは、breakと同等の意味を持つ
- Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の対処法は、continueの後に、スキップさせたいループ処理までの距離を書けばOK
関連記事
https://www.php.net/manual/ja/migration73.incompatible.php