switch文による条件分岐
2012.08.29
条件分岐は、圧倒的に if~elseif~ else文を使う事が多いのですが、switch文を使うと条件分岐をより抽象化できる気がします。
switch 文
変数の単純な値(文字列を含む)の比較を複数回実行し、条件に応じて異なる処理を実行する場合などはif文より使い易く、コードの可読性も上がるのでデバッグが楽になると思います。
と、判っていても…自分はswitch文の使用頻度が低いので、スグに構文を忘れてしまいます。(^^;
つい、使い慣れたif~elseif~ else文でダラダラと冗長なコードを書いて、デバッグの段階で反省の毎日…orz
なので備忘録を兼ねて簡単な占い(?)のスクリプトを書いてみました…。
mt_rand関数で1~8のランダムな数字を発生させ、変数 $str に代入し、[サンプル1]のif文と、[サンプル2]のswitch文で、双方同じ処理(条件判定)を行っています。
PHP.net 公式マニュアル
if ~ else if ~ else で条件分岐
sample_switch_1.php : Sample Code
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP:switch Sample.1</title> </head> <body> <h2>今日のアナタの運勢は… <?php $str = mt_rand(1, 8); if( $str == 1 ){ echo "【☆】とても私のクチからは…元気出して下さい…゚・(つД`)・゚・"; }else if( $str == 2 ){ echo "【☆☆】やる事なす事、すべて裏目に出るでしょう…( ̄□ ̄||| "; }else if( $str == 3 ){ echo "【☆☆☆】ドンマイ!明日があるさ…(´Д`;)"; }else if( $str == 4 ){ echo "【☆☆☆☆】まあまあやね…(´・ω・`)"; }else if( $str == 5 ){ echo "【☆☆☆☆☆】ふんッ!いつも幸運だとは限らないからなっ!( ̄へ ̄)ノ"; }else if( $str == 6 ){ echo "【☆☆☆☆☆☆】ハッピーな一日になるでしょうネ…多分( ̄ー ̄)ニヤリッ"; }else if( $str == 7 ){ echo "【☆☆☆☆☆☆☆】無敵モードです!(`・ω・´) キリッ"; }else{ echo "【☆☆☆☆☆☆☆☆】ほほう…(*´▽`*)"; } ?> </h2> </body> </html>
普通にif文で条件分岐させると、個人的に見慣れたダラダラコードが出来上がりました...(´Д` )
switch 文で条件分岐
sample_switch_2.php : Sample Code
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP:switch Sample.2</title> </head> <body> <h2>今日のアナタの運勢は… <?php $str = mt_rand(1, 8); switch( $str ){ case 1; echo "【☆】とても私のクチからは…元気出して下さい…゚・(つД`)・゚・"; break; case 2: echo "【☆☆】やる事なす事、すべて裏目に出るでしょう…( ̄□ ̄||| "; break; case 3: echo "【☆☆☆】ドンマイ!明日があるさ…(´Д`;)"; break; case 4: echo "【☆☆☆☆】まあまあやね…(´・ω・`)"; break; case 5: echo "【☆☆☆☆☆】ふんッ!いつも幸運だとは限らないからなっ!( ̄へ ̄)ノ"; break; case 6: echo "【☆☆☆☆☆☆】ハッピーな一日になるでしょうネ…多分( ̄ー ̄)ニヤリッ"; break; case 7: echo "【☆☆☆☆☆☆☆】無敵モードです!(`・ω・´) キリッ"; break; default; echo "【☆☆☆☆☆☆☆☆】ほほう…(*´▽`*)"; } ?> </h2> </body> </html>
switch文で条件分岐させるとコードが読みやすい...でしょうか?(^^;
case の行末はコロン(:)、セミコロン(;)のどちらでもOKですが、1つのスクリプト内では統一するのが基本ですね…。
ちなみに自分はコロンよりセミコロンの方が好みです。
switch文で break を書き忘れると全ての処理が実行されてしまいます。(コレをいつも忘れてしまう…)
どのケースにもマッチしない場合は default に書かれた処理が実行されますが、上のサンプルで default を使うのは…(ーー;)
サンプルでは、必ず1~8の数字が変数 $str に入るので、本来は 【case 8;】として処理すべきですし、自分の場合 switch文は条件判定が明確な場合に使う事が多いので default を使う場面が今一つピンと来ません。(何れかのケースに100%マッチするならば default は不要)
switch文に於ける default は、何れのケースにも当て嵌まらない場合の処理、例えばエラーなど、想定外のケース(条件)が発生した場合の処理か、逆に圧倒的多数の条件に対応する処理が記述されているコードを多く見かけます。