【もう迷わない】プログラミングスクールをポイント別に紹介

【Laravel】Switch文の書き方や注意点!条件分岐が多いならswitch

if文で条件分岐が多くなったときになんだかみづらいなぁ….
Switch文の書き方が知りたい…

こんな疑問を解決します。

if文で条件分岐が多いと、else ifが多くなったり{}が多くなったりみづらく感じることありますよね。

そんな時はSwitch文を活用しましょう!

switch文であれば、条件分岐でもスッキリと書けるので見栄えも良くなります。

見栄えが良くなるとコードも読みやすくなるので、コードミスも減りますよ。

今回は、switch文の書き方と注意点についてご紹介していきます。

本記事のゴール
  • switch文の書き方がわかる
  • switch文を書く際の注意点がわかる
Contents

if文で書く場合

まずはif文で条件分岐の多いコードを書くと以下のようになります。

        $num = 7;

        if ($num === 1) {
            return  'おはよう!';
        } else if ($num === 2) {
            return  'こんにちは!';
        } else if ($num === 3) {
            return  'こんばんは!';
        } else if ($num === 4) {
            return 'hello!';
        } else if ($num === 5) {
            return 'good!';
        } else if ($num === 6) {
            return 'ナマステー!';
        } else if ($num === 7) {
            return 'おっすオラ悟空!';
        } else {
            return false;
        }

画面にはおっすオラ悟空が表示されます。

これでもいいのですが、else ifがなんだかうざったいですよね。{}も多いし、コードがみづらいです。

ちなみに===は型も厳密に比較することを意味します。つまり、数値型で7だったら、条件分岐の7であると判定します。

==の場合は、型判定をしないので数字型の7でも文字列型の7でも判定してくれますが、予期せぬエラーも発生するので注意です。

(例えば、$num = ‘5 secounds’と定義した時に、$num == 5はtrueと判定してしまうといったエラー。)

なので条件分岐で数値の判定をする場合は、===で判定するべきなんですね。

本題に戻ると、ifで条件分岐が多くてみづらい時に、switch文であればスッキリと書けます。

今回参考にした本:独習PHP 第4版

Switch文の書き方

ここからswitch文の書き方を解説します。

まずは、構文はこんな感じ。

        switch (式) {
            case 値1:
                // 「式 == 値1」である場合に実行する処理
                break;
            case 値2:
                // 「式 == 値2」である場合に実行する処理
                break;
            .....
            default :
                // 式が値1,値2,...のいずれでもない場合に実行する処理
                // if文でいえばelseに該当
                break;
        }

具体的に書くとこんな感じ。

        $hoge = '炭治郎';

         switch ($hoge) {
            case '鱗滝さん':
                echo '炭治郎の師匠です';
                break;
            case '煉獄さん':
                echo '無限列車で大活躍!';
                break;
            case '炭治郎':
                echo '鬼滅の刃の主人公';
                break;
            case '禰󠄀豆子':
                echo '炭治郎の妹。爆血に感動。';
                break;
            default :
                echo '該当しませんでした';
                break;
        }

// 出力結果:鬼滅の刃の主人公

こんな感じで書けます。

先程のif文も以下のように書けます。

         $num = 7;

      switch ($num) {
            case 1:
                echo 'おはよう';
                break;
            case 2:
                echo 'こんにちは!';
                break;
            case 3:
                echo 'こんばんは!';
                break;
            case 4:
                echo 'hello!';
                break;
            case 5:
                echo 'good!';
                break;
            case 6:
                echo 'ナマステー!';
                break;
            case 7:
                echo 'おっすオラ悟空!';
                break;
            default:
                echo '該当しない';
                break;
        }

// 出力結果:おっすオラ悟空!

これでswitch文でスッキリとしたコードが書けました。

ただ、このコードは不完全です。(炭治郎の条件分岐はOKです。)

理由は、switch文は==のあいまいな判定をするから。

炭治郎の条件分岐は文字列型なので問題ないのですが、今回のあいさつの条件分岐は数字型を扱っています。

あいまいな判定であると、予期せぬエラーが起きるのでしたね。

それでは、switch文の注意点を解説していきます。

Switch文を書く時の注意点

switch文を書くときの注意点としては、

  • caseの末尾にはbreakを必ず書く
  • defaultも書いてエラーを防ぐ
  • switch文の判定は==で行われる
  • 数字型を判定するときは===で行われるようにする

こんな感じ。

breakを書くことですが、もしbreakをcaseの末尾に書かないと、次のcaseも読み込まれてしまいます。

        $hoge = '炭治郎';

         switch ($hoge) {
            case '鱗滝さん':
                echo '炭治郎の師匠です';
                break;
            case '煉獄さん':
                echo '無限列車で大活躍!';
                break;
            case '炭治郎':
                echo '鬼滅の刃の主人公';
            case '禰󠄀豆子':
                echo '炭治郎の妹。爆血に感動。';
            default :
                echo '該当しませんでした';
        }

// 出力結果
鬼滅の刃の主人公炭治郎の妹。爆血に感動。該当しませんでした

breakの記述がない部分が全て実行されるので、caseの最後にはbreakを書きましょう。breakを書くことでswitch文から抜けられます。

次にswitch文は==の判定を行うので、数字型を扱うときは注意しましょう。

===の判定で数字型もチェックしておけば、予期せぬエラーも防げるからです。

($hoge = ‘5 secounds’と 5が同値になってしまう現象を防げます。)

やり方は以下です。

     $num = 7;  
      
     switch (true) {
            case ($num === 1):
                echo 'おはよう';
                break;
            case ($num === 2):
                echo 'こんにちは!';
                break;
            case ($num === 3):
                echo 'こんばんは!';
                break;
            case ($num === 4):
                echo 'hello!';
                break;
            case ($num === 5):
                echo 'good!';
                break;
            case ($num === 6):
                echo 'ナマステー!';
                break;
            case ($num === 7):
                echo 'おっすオラ悟空!';
                break;
            default:
                echo '該当しない';
                break;
        }

switch(true)にして、あとは===で判定させるようにすることですね。

あとたまに罠にハマりがちなのが、上記で書いたのにswitch文が上手く作用しない…ってこと。

その場合、そもそも$numの変数が数値型(int)ではなく文字列型(string)になっている可能性があります。

var_dump($num);で確認してみて、(int)7になっていることを確認しましょう。

        $num = 7;
        $num_1 = '7';
        var_dump($num); // (int)7
        var_dump($num_1); // (string)7

(string)7になっていたら===判定は通過しません。

※私もハマりましたが、$num = $request->id;で受け取ったものはstring型で全て返って来るようです。
なので、$num = (int)$request->id;などどして、数値型に置き換えるのがいいでしょう。

【まとめ】Switch文の書き方や注意点

今回は条件分岐が多いif文であればswitchを活用してコードをスッキリさせようというコンセプトで記事を書いてみました。

if文やswitch文は調べるとまだまだたくさん方法があるので面白いですよ!

ぜひ自分に合った、チームに合った美しいコードを追求してくださいね。

コメント

コメントする

CAPTCHA


Contents
閉じる