switch文の基本構文(case,default)
PHPの条件分岐にはif文だけでなくswitch文というものも存在します。
switch~case(複数)~defaultを使って命令を構築します。
使いようによってはif文と同じように使えますが、動きはまったく違います。
まずは基本構文から見てみましょう。
switch(判定する値){
case "値①":
値が①のときは処理がここからスタート
case "値②":
値が②のときは処理がここからスタート
case "値③":
値が③のときは処理がここからスタート
default :
値がどれでもないときは処理がここからスタート
}
switch文の具体例
先に具体例を示します。まずは読み進めてみてください。
$start = "②";
switch($start){
case "①": //$startの値が①ならここから始まる
echo "①" . PHP_EOL;
case "②": //$startの値が②ならここから始まる
echo "②" . PHP_EOL;
case "③": //$startの値が③ならここから始まる
echo "③" . PHP_EOL;
default: //$startの値がどれでもないならここから始まる
echo "他" . PHP_EOL;
}
出力結果
②
③
他
判定する値である$startが②であるので case “②”:の処理から始まりその後すべてが上から順番に実行されます。これがswitch文の基本的な流れです。
case部分は複数無限に記述でき、defaultは1つのみで省略可能です。
まずは「値が一致した場所からはじまる」という処理だということを押さえておいてください。
if文のように使うには中断のbreak命令で
switch文はif文の書き換えのような説明をしている場合がありますが、それは厳密には間違いです。
switchにはbreakを使ってswitch文を中断させるという機能があります。
それを用いたときif文と同じような動作を実現することができるのです。
switch(判定する値){
case "値①":
値が①のときは処理がここからスタート
break; //switch終了
case "値②":
値が②のときは処理がここからスタート
break; //switch終了
case "値③":
値が③のときは処理がここからスタート
break; //switch終了
default :
値がどれでもないときは処理がここからスタート
break; //switch終了
}
このように処理の直後に中断のbreakをすることによりあたかもif文のif~else if~elseのような動きを実現することができます。
$start = "②"; //②からスタートさせる
switch($start){
case "①": //$startの値が①ならここから始まる
echo "①" . PHP_EOL;
break; //switch終了
case "②": //$startの値が②ならここから始まる
echo "②" . PHP_EOL;
break; //switch終了
case "③": //$startの値が③ならここから始まる
echo "③" . PHP_EOL;
break; //switch終了
default: //$startの値がどれでもないならここから始まる
echo "他" . PHP_EOL;
break; //switch終了
}
出力結果
②
また、次のように命令なしのcaseを連続させることでif文の複数OR条件のようなこともできます。
$start = "②"; //②からスタートさせる
switch($start){
case "①": //$startの値が①ならここから始まる
echo "①" . PHP_EOL;
break; //switch終了
case "②": //$startの値が②ならここから始まる
case "③": //$startの値が③ならここから始まる
case "④": //$startの値が④ならここから始まる
echo "②③④" . PHP_EOL;
break; //switch終了
default: //$startの値がどれでもないならここから始まる
echo "他" . PHP_EOL;
break; //switch終了
}
出力結果
②③④
switchはあいまいな比較==と同様に評価される
switch~caseの値の評価はどのようにされているのでしょうか?
1と”1″とtrueは同じものになるのでしょうか?
結論からいいますと同じものになります。
==の評価と同様、あいまいに暗黙の変換がされます。
$start = "1.0"; //文字列の1.0
switch($start){
case 1: //$startの値が1ならここから始まる
echo "①" . PHP_EOL;
case 2: //$startの値が2ならここから始まる
echo "②" . PHP_EOL;
case 3: //$startの値が3ならここから始まる
echo "③" . PHP_EOL;
default: //$startの値がどれでもないならここから始まる
echo "他" . PHP_EOL;
}
出力結果
①
②
③
他
おまけ① defaultの位置
ちょっとここで問題です。
次のコードは正常に実行可能ですが、出力結果を考えてみてください。
$start = "???";
switch($start){
default:
echo "他" . PHP_EOL;
case "①":
echo "①" . PHP_EOL;
case "②":
echo "②" . PHP_EOL;
case "③":
echo "③" . PHP_EOL;
}
出力結果
他
①
②
③
どうでしょうか?defaultを最初にもってくるというのは筆者は見たことはありませんが、switchの「値が一致すればそこから、しなければdefaultから」という動きを理解した方なら簡単にわかったのではないでしょうか?
おまけ② breakの代わりにcontinueやreturnが使える?
よくある誤解としてbreakの代わりにcontinue命令やreturn命令を使ってしまうということがあります。
結論からいうとcontinueはswitchの脱出として使えます。
returnはswitchとは関係なく通常のreturnとして処理されます。
おまけ③ switch文は使わない?代わりにif文を?
switch文は使いどころによっては非常に便利ですが、現場のプログラミングの規約上ではルールをシンプルにするため使わないよう禁止されている場合もあります。
その場合はどんなにコードが長くなろうともif文を使うことを推奨している場合が多いです。ここまで読んでいただいた皆さんはわかると思いますが、switch文はif文に比べるとちょっと理解しづらくbreakを忘れたりしやすいのでバグの原因となるためです。
コードを短くしたがるのがエンジニアの性ではありますが、多くの人が参加する現場ではそんなことよりも、シンプルさや誰もが理解でき使えるコードが求められることが多いからです。
ですが、switchが便利な命令であることは変わりなく、様々なプログラミング言語で登場しますので概念を覚えておいて絶対に損はありません。
コメント