最近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は引数ありで使うべきと言いたいんでしょうか。
(そう私は解釈しました。)