質問: PHPのswitchは緩やかな比較になるので使うべきではないと思ってるのですが使いどころはありますか? ``` 1、処理が速い 2、可読性が高くなる ``` メリットとしてこれらを挙げる人がいますが 1についてはそう書いてる記事がたまにありますが、少なくとも以下のコードでは差はありませんでした。(version:7.0.22) 2については条件(1,2,3)が同じ列に並んでるため読みやすいようにも思えます。 (ただ分岐が複数ある時点で可読性がいいとは言えないと思うのですが。) > > if文(緩やかな比較) > > > ``` > switch文 > > > ```
回答: 動作速度はほとんど変わらないので,そこは論点ではありません。公式マニュアルにも書いてありますが,以下のようなパターンが特に問題となります。 * `0` `""` `"0"` `false` `null` など**互いに型が違う falsy な値**が case 条件として複数存在する場合 * truthy でも `0 == "0abc"` `"1e2abc" == 100` `"1e2" == "100"` などの一致判定で問題となる場合 (コメントの指摘により追加) これに該当しない場合は特に機能上のデメリットは無いと考えてください。 ``` $var = "0"; switch ($var) { case 0: $result = "this is integer zero"; break; case "0": // ここは絶対通らない $result = "this is string zero"; break; } echo $result; ``` 一番好きなのは**「早期リターン」**と呼ばれる書き方です。関数・メソッド・クロージャとしてこの部分だけ分割しているときに使えます。 ``` if ($var === 0) { return "this is integer zero"; } if ($var === "0") { return "this is string zero"; } ``` この場合, switch で書いても break が不要なので読みやすくなります。 ``` switch ($var) { case 0: return "this is integer zero"; case 1: // 比較条件に問題が無い場合は switch で良い return "this is integer one"; } ``` まとめると, * まずは適切にロジックを分割して早期リターンを積極的に採用する。この際 switch が問題なく使える場合は,早期リターンと組み合わせて if の代わりに使ったほうが見やすい場合が多い。 * 早期リターンが使えない場合は,それほど積極的に switch を採用する理由はない。