Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. PHP入門編 - 処理を分岐させるswitch文について

処理を分岐させるswitch文について

みなさまどうも。いかがお過ごしでしょうか。

続きまして『switch文』(スイッチぶん)というのを勉強していきましょう。こちら『if文』とちょっと似ている感じで分岐処理を行うものです。『if文』では基本的に2通りずつ分岐処理をさせていくものでしたが『switch文』では同時に多数の分岐処理をさせていくことができます。

『switch文』はPHP以外のほぼ全ての言語で実装されている構文になり、使用頻度はまあまあといったところなのですが、PHPの『switch文』は少々使い勝手が悪く、多数の条件分岐をさせたい場合でも『if文』で構築されることが多めです。そちらも合わせてみていきましょう。

まず基本的な構文はこのようになります。

<?php
$num = 1;

switch($num){
    case 1:
        var_dump('1です!');
        break;
    case 2:
        var_dump('2です!');
        break;
    case 3:
        var_dump('3です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

ちょっと構文がややこしいのでひとつひとつ確認していきましょう。

まず変数『num』に『1』が代入されていますね。続いて『switch』と書いてあります。これは『if文』でいうところの『if』にあたるところです。『switch文』なので『switch』になりますね。

そして次に『()』があります。ここに評価させたい変数などを入れます。今回は変数『num』になりますね。

そして『{}』を書き、その中に『case』と記述し、半角スペースをあけて『1』と記述し、さらに『:』を入力します。これは『()』の中に書いてある変数『num』の中身が『1』だった場合に『:』以降の処理を実行してね、といった命令になります。なので今回は『var_dump('1です!');』と『break;』が実行されます。

続く『case 2』というのも同じような感じで、変数『num』が『2』ならば『:』以降の処理を実行してね、といった命令になります。最後に書いてある『default』という記述ですが、これはその前の『case』での評価がすべて成立しなかった場合に実行されます。

例えばこうしてみましょう。

<?php
$num = 4;
 
switch($num){
    case 1:
        var_dump('1です!');
        break;
    case 2:
        var_dump('2です!');
        break;
    case 3:
        var_dump('3です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

変数『num』の値を『4』にしてみました。『case』で指定された値に『4』がありません。なので上記の場合は『default』の処理である、『var_dump('defaultです!');』と『break;』が実行されるはずですね。実行した結果は以下です。

string(16) "defaultです!"

『default』の処理がちゃんと実行されていますね。

さて、先程からちょいちょい出てきている『break』(ブレイク)ってやつですが、これは『break文』と呼ばれ『処理を抜けなさい』といった命令になります。実は『swith文』において『break文』が存在しない場合は『case』で評価された記述よりその先の処理をずっと実行していってしまいます。ちょっと実験してみましょう。

<?php
$num = 1;
 
switch($num){
    case 1:
        var_dump('1です!');
 
    case 2:
        var_dump('2です!');
 
    case 3:
        var_dump('3です!');
 
    default:
        var_dump('defaultです!');
        break;
}

先ほどの記述で『break文』をいくつか抜いてみました。今の変数『num』の値は『1』です。これを実行した結果は以下です。

string(10) "1です!"
string(10) "2です!"
string(10) "3です!"
string(16) "defaultです!"

『case 1:』よりも先の処理がすべて実行されましたね。『break文』をいれないとこのような挙動をみせます。ちなみに『break文』を入れない、というような『switch文』のパターンが構築されることはまれです。なので『switch文』を使うときは『break文』もセットで記述する、と丸暗記しちゃうのもありです。

さてではちょっと応用技です。『文字列』なども比較する要素として組み込むことができます。

<?php
$num = 'miku';
 
switch($num){
    case 'miku':
        var_dump('mikuです!');
        break;
    case 2:
        var_dump('2です!');
        break;
    case 3:
        var_dump('3です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

変数『num』には『'miku'』という文字列が入っていますね。『case 'miku':』と記述されていますので、これはその後に続く『var_dump('mikuです!');』と『break;』が実行されるはずです。実行してみるとこうなります。

string(13) "mikuです!"

ちゃんと実行されているようですね。『switch文』はこんな感じで使用します。ここまでは大丈夫そうでしょうか。

さて、このままPHPでの『switch文』の使いづらいところを紹介します。PHPでの『switch文』の比較は厳密な比較がされません。『===』ではなく『==』です。『型』もちゃんと同じであるかどうかチェックした上での比較は行ってくれません。なので以下で実行される処理は『case 1:』となります。

<?php
$num = '1';
 
switch($num){
    case 1: // 厳密な比較じゃないためここが実行されます。
        var_dump('1です!');
        break;
    case 2:
        var_dump('2です!');
        break;
    case 3:
        var_dump('3です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

変数『num』の値は文字列としての『1』が入っています。これは数値の『1』ではありません。しかし、厳密な比較が行われないため、文字列『1』と数値『1』が等しいという演算結果になり、『case 1:』の処理が実行される、といった感じです。

さらにへんてこりんな処理をさせてみましょう。以下は真偽値『false』を『switch文』で処理させたパターンです。

<?php
$num = false;
 
switch($num){
    case 0:
        var_dump('0です!');
        break;
    case 1:
        var_dump('1です!');
        break;
    case 2:
        var_dump('2です!');
        break;
    case 3:
        var_dump('3です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

これを実行させるとこうなります。

string(10) "0です!"

『default』が実行されそうな感じですが、『case 0:』が実行されちゃっています。これは真偽値『false』と『0』が等しい、と判定されているせいですね。

他の言語では『厳密な比較』が行われるようになっていることが多いのですが、PHPは違っています。こんな感じでPHPでの『switch文』は中々曲者なのでございます。

このような厳密な比較がされない事象を打開する方法として以下のような記述方法があります。

<?php
$num = 1;
 
switch(true){
    case $num === 0:
        var_dump('0です!');
        break;
    case $num === 1:
        var_dump('1です!');
        break;
    case $num === 2:
        var_dump('2です!');
        break;
    default:
        var_dump('defaultです!');
        break;
}

PHPでは『case』の後に演算式を書くことが可能なのですが、各『case』の後に『===』を使った厳密な比較を行う演算式を書いて、その結果を『switch文』の『()』の中の真偽値『true』と比べる、という手法です。

こうすることで厳密な比較を行ってくれる『switch文』ができあがるのですが、「そこまでやるなら『if文』使えばよくね?」って感じがしてしまいますよね。

<?php
$num = 1;
 
if($num === 0) // 上記の『switch文』はこのように書き換えられます。
    var_dump('0です!');
else if($num === 1)
    var_dump('1です!');
else if($num === 2)
    var_dump('2です!');
else
    var_dump('defaultです!');

なのでPHPでの『switch文』は使用される機会は少なめになっています。著者もPHPではif文で構築することがほとんどです。

というわけで以上となります。次の記事では練習がてら「アクセスしてきた時刻を表示するプログラム」を書いてみましょう。そこで『switch文』とかif文とか比較演算子とかの使い道を体験できるかと思います。ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。