最近PHP7.3にしました!
すると、以下のエラーで大好きなcomposerが使えなくなりました。
"continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?
Google翻訳さんを使って、
「continue」ターゲティングスイッチは「break」と同じです。 “continue 2″を使用するつもりでしたか?
的なことをいってるみたいだなとわかりました。
( 解決策はQiitaに書いてます! )
composer installができなくなった時の解決法(PHP7.3)
そこでまず、
▶︎PHP7.3から、continueをbreakの代わりに使うと、Warningになる?
▶︎continue 2とは?使ったことない!
と私は直感で思いました。
よくわからなかったので、
とりあえず、やってみます。
参考:https://blog.ohgaki.net/php-7-3#continue
$ php -v
PHP 7.3.1 (cli) (built: Jan 10 2019 13:15:37) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies
test_continue.php
<?php
//$month = 1;を想定
for ($day = 1; $day <= 31; $day++) {
$message = "{$day}日は、";
switch ($day) {
case 1:
$message .= "月初\n";
continue; //break;と同じらしい
case 15:
$message .= "月のど真ん中\n";
continue;
case 31:
$message .= "月末\n";
continue;
default:
$message .= "なんともいえない日\n";
continue;
}
echo $message;
}
いざ、実行!
$ php test_continue.php PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /Users/kin29/php7_3/test_continue.php on line 11 ... /Users/kin29/php7_3/test_continue.php on line 14 ... /Users/kin29/php7_3/test_continue.php on line 17 ... /Users/kin29/php7_3/test_continue.php on line 20 1日は、月初 2日は、なんともいえない日 ... 15日は、月のど真ん中 16日は、なんともいえない日 ... 31日は、月末
やはり、warningでてますねえ。
おっしゃる通りにcontinue→breakにしてみる。
test_break.php
<?php
//$month = 1;を想定
for ($day = 1; $day <= 31; $day++) {
$message = "{$day}日は、";
switch ($day) {
case 1:
$message .= "月初\n";
break; //continue;と同じ動作をするはず
case 15:
$message .= "月のど真ん中\n";
break;
case 31:
$message .= "月末\n";
break;
default:
$message .= "なんともいえない日\n";
break;
}
echo $message;
}
breakで実行すると、
warningも出ず、continueの時と同じ挙動のようです!!!
$ php test_break.php 1日は、月初 2日は、なんともいえない日 ... 15日は、月のど真ん中 16日は、なんともいえない日 ... 31日は、月末
そもそも、switchには普段からbreak使ってます。
なんとなくcontinueを使わず、break使ってましたが、それが正しいようです。
ではcontinueの使い時は?continue 2とは?
の確信につきたいと思います。
test_continue_2.php
<?php
//$month = 1;を想定
for ($day = 1; $day <= 31; $day++) {
$message = "{$day}日は、";
switch ($day) {
case 1:
$message .= "月初\n";
break;
case 15:
$message .= "月のど真ん中\n";
break;
case 31:
$message .= "月末\n";
break;
default:
$message .= "なんともいえない日\n";
continue 2; //抜けるループのレベル指定
}
echo $message;
}
さっそく実行!
$ php test_continue_2.php 1日は、月初 15日は、月のど真ん中 31日は、月末
continueに引数を使うと、抜けるループレベルが指定できるようです。
今回の例でいくと、breakやcontinue(引数なし)ではswitch文しか抜けません。
ただし、continue 2(引数あり)とするとfor文からも抜けだすことができます。
まとめ
breakとcontinue(引数なし)は同じ意味なのに、別で存在しているので統一させたい。
あんど、continueは引数ありで使うべきと言いたいんでしょうか。
(そう私は解釈しました。)