if文で条件分岐が多くなったときになんだかみづらいなぁ….
Switch文の書き方が知りたい…
こんな疑問を解決します。
if文で条件分岐が多いと、else ifが多くなったり{}が多くなったりみづらく感じることありますよね。
そんな時はSwitch文を活用しましょう!
switch文であれば、条件分岐でもスッキリと書けるので見栄えも良くなります。
見栄えが良くなるとコードも読みやすくなるので、コードミスも減りますよ。
今回は、switch文の書き方と注意点についてご紹介していきます。
- switch文の書き方がわかる
- switch文を書く際の注意点がわかる
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
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文は調べるとまだまだたくさん方法があるので面白いですよ!
ぜひ自分に合った、チームに合った美しいコードを追求してくださいね。
休日で空いた時間の暇つぶしを探せるアプリを公開しています。
コメント