(PHP7.3以降) for文内のswitchでcontinueを使うと「Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”?」が出る

(PHP7.3以降) for文内のswitchでcontinueを使うと「Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?」が出る

 

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”? の原因




Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? が出る原因は、switch構文の中でcontinueを使用しているからである。

Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2

 

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

continueから、各ループ処理までの距離を表した画像

 

見て分かる通り、
現在のループ処理の居場所を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”? の原因と対処法まとめ

では最後にまとめて終了

 

  1. Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? が出る原因は、switch構文の中でcontinueを使用しているから
  2. phpにおいて、switch構文の中でのcontinueは、breakと同等の意味を持つ
  3. Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? の対処法は、continueの後に、スキップさせたいループ処理までの距離を書けばOK

 

 

関連記事

 

 

(PHP) php7以降で、Illegal string offset のエラーが出る【対処法】

(PHP) コールバック関数とは?使い方を分かりやすく解説

 

 

https://www.php.net/manual/ja/migration73.incompatible.php

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です