結論は大したことないんだけど、せっかくなので調べた痕跡を残しておきます。なんかの役に立つかもなので…。
ToolsetTypesが有料になってから、バージョンアップが出来ずにいる環境で、PHP5.6からPHP7.3に移行してみると、
Warning: “continue” targeting switch is equivalent to “break”.
というWarningが出る。
これは、PHP7.3になってから、break的に使用していたcontinueの曖昧さがWarning対象になったからという記事があった。continueを使うなら、どれだけ階層を抜けるのかを明示しなければならないらしい。
[thanks参考記事]PHP7.3からbreakの代わりにcontinueを使うとWarningになる。
自分で書いたスクリプトじゃないので、
このSwitchの構文内の「if文」の中にあるcontinueが、ただのbreak的に使われているか、何かを抜け出すためにcontinue的に使われているのかが、判断つかない。
PHP5.6のときの挙動(期待する動き)がそもそもなんだったかを確かめなければ……ということで、テストしてみることにする。
出てくるWariningについて
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? in /app/public/wp-content/plugins/types/vendor/toolset/types/embedded/includes/wpml.php on line 646
Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? in /app/public/wp-content/plugins/types/vendor/toolset/types/embedded/includes/wpml.php on line 663
Warning: Cannot modify header information – headers already sent by (output started at /app/public/wp-content/plugins/types/vendor/toolset/types/embedded/includes/wpml.php:663) in /app/public/wp-content/plugins/multi-device-switcher/multi-device-switcher.php on line 448
3つ目は毛色が違うので、先の二つに着目する。
まず何が書いてあるか。
Line646とLine663は同じ「function」内に記載してある。
/**
* Registers labels.
*
* @param string $prefix
* @param array $data
* @param string $context
*/
function wpcf_wpml_register_labels( $prefix, $data, $context = 'post' ) {
foreach ( $data['labels'] as $label => $string ) {
switch ( $context ) {
case 'taxonomies':
case 'taxonomy':
case 'tax':
$default = wpcf_custom_taxonomies_default();
if ( $label == 'name' || $label == 'singular_name' ) {
$string_context = array( 'domain' => 'Types-TAX' );
$string_context['context'] = $label === 'name' ? 'taxonomy general name' : 'taxonomy singular name';
wpcf_translate_register_string( $string_context, false, $string );
continue;
}
if ( isset( $default['labels'][$label] ) && $string == $default['labels'][$label] ) {
wpcf_translate_register_string( 'Types-TAX', $label, $string );
} else {
wpcf_translate_register_string( 'Types-TAX',
$prefix . ' ' . $label, $string );
}
break;
default:
$default = wpcf_custom_types_default();
// Name and singular_name
if ( $label == 'name' || $label == 'singular_name' ) {
wpcf_translate_register_string( 'Types-CPT',
$prefix . ' ' . $label, $string );
continue;
}
// Check others for defaults
if ( isset( $default['labels'][$label] ) && $string == $default['labels'][$label] ) {
// Register default translation
wpcf_translate_register_string( 'Types-CPT', $label, $string );
} else {
wpcf_translate_register_string( 'Types-CPT',
$prefix . ' ' . $label, $string );
}
break;
}
}
}
下記のようなプログラムを動かしてみなければ……。
$array = array();
foreach($array as $key => $value){
switch ( $value ) {
$a = 0;
case 'A':
if(D){
$a = 4;
continue;
}
if(E){
$a = 1;
}
break;
case 'B':
$a = 2;
break;
case 'C':
$a = 3;
break;
}
}
つまり、Aのときに、Dという条件を通ったときに、$aの値がどうなるかがPHP5.6とPHP7.3で差が出るのではないかという予想。また、DとEがtrueのときとEがfalseのときと何か変わるのかな。という実験。
所属会社:課:名前という配列を作る。
りんご会社:総務課:山本
りんご会社:開発課:鈴木
みかん会社:総務課:山田
ぶどう会社:総務課:佐藤
$array[] = array('company'=>'りんご会社','ka'=>'総務課','name'=>'山本');
$array[] = array('company'=>'りんご会社','ka'=>'開発課','name'=>'鈴木');
$array[] = array('company'=>'みかん会社','ka'=>'総務課','name'=>'山田');
$array[] = array('company'=>'ぶどう会社','ka'=>'総務課','name'=>'佐藤');
foreach($array as $value){
$a = 0;
switch ( $value['company'] ) {
case 'りんご会社':
if($value['ka'] == "総務課"){
$a = 4;
break;
}
if($value['name'] == "鈴木"){
$a = 1;
}
if($value['name'] == "山本"){
$a = 8;
}
break;
case 'みかん会社':
$a = 2;
break;
case 'ぶどう会社':
$a = 3;
break;
}
echo $value['name']."は".$a;
}
PHP5.6もPHP7.3も
山本は4鈴木は1山田は2佐藤は3
うーん。スキップしたいだけなら、breakで良いのではないかなぁ。switchとcaseの間に何かいれるとエラーが出るし、やはり単純に下のif文を飛ばしたかっただけなのではないかという気がしている。ので、breakでよいのかなと思います。
たとえば、「continue;」を「continue 2;」にしたら?
PHP5.6もPHP7.3だと
鈴木は1山田は2佐藤は3
Switchを最後までせずに、その上に上ってしまう。
たとえば、「continue;」を「continue 3;」にしたら?
Fatal error: Cannot ‘continue’ 3 levels in
というエラーが出ます。
なので「番号のついてない continue」は「break」と同じ挙動を想定されているのではないかと思います。
が、何故「break」にしなかったのかな。
switchとcontinueについて調べていて、わかりやすかった記事があったので紹介します。
[thanks 参考記事] [PHP]switch文の危険な2パターン
さてますますbreakとcontinueの違いがわからなくなってきましたよ。
[thanks参考記事]PHPでのcontinueとbreakの違いとループをスキップや終了する方法
と、調べていて、continueについてPHPのマニュアルを見る(まず見ろよ)
注意: PHP では、continue の動作に関しては switch 文がループ構造とみなされます。 continue に引数を渡さなかった場合の動きは break と同じですが、間違いの元なので警告が生成されます。 switch がループ内にある場合、 continue 2 とすると、外側のループの次回の処理から続行します。
ばっちり書いてあった……。
ので、continueはbreakにしてよかろう!
「switch文がループ構文とみなされます」というところが肝だと思いました。
だから、foreachの中のswitchの中のif分で「continue」が書かれてようが「break」が書かれていようが挙動は一緒になんですね。
これが、switchの関わらない「foreach」だったら「foreach」最初に戻るか抜け出るかみたいになるので、違うんでしょうけど……。foreachの中のswitchの上に行こうが下に行こうが次の行き先は同じというか、breakの先にcontinueでたどり着く場所があるということなので……。
ちゃんとマニュアル読めばよかったーと思ったけど、最初からマニュアルを読んでたら、多分意味がわからなかっただろうなぁと思うので、まぁ、よいのです。
なので、「Types」のプラグインの「wpml.php」のエラーが出ている場所の「continue」を「break」にして動作確認しました。
コメントを残す