結論は大したことないんだけど、せっかくなので調べた痕跡を残しておきます。なんかの役に立つかもなので…。
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のときと何か変わるのかな。という実験。
所属会社:課:名前という配列を作る。
りんご会社:総務課:山本
りんご会社:開発課:鈴木
みかん会社:総務課:山田
ぶどう会社:総務課:佐藤
<?php $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」にして動作確認しました。
コメントを残す