PHPのswitch文:初心者向けガイド

JavaScriptを有効にしてください

前書き

PHPでプログラムを作成する際、条件分岐は欠かせない重要な要素のひとつです。
一般的にif文を使って条件を分岐させることが多いですが、条件の数が増えるとコードが長くなり、可読性が低下してしまうことがあります。

そこで活躍するのがswitch文です。
switch文を使えば、特定の変数の値に応じて複数の処理を簡潔に記述できます。
特に、同じ処理を複数の条件で実行する場合には、「フォールスルー」を活用することで、さらにスッキリしたコードを書くことが可能です。

本記事では、PHPのswitch文の基本構文から、フォールスルーの活用方法型の比較の注意点まで、初心者の方にも分かりやすく解説します。

switch文の基本構文

PHPのswitch文は、ある変数の値に応じて複数の処理を分岐させるための構文です。if文を使って複数の条件をチェックする方法もありますが、条件が多くなる場合、switch文を使うとコードがすっきりまとまります。
基本的な構文は以下のとおりです。

php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
switch ($変数) {
    case 値1:
        // $変数が値1の場合の処理
        break;
    case 値2:
        // $変数が値2の場合の処理
        break;
    // 他のケース...
    default:
        // どのcaseにも一致しなかった場合の処理
        break;
}

各caseの末尾に必ずbreakを記述することで、そのcaseの処理が完了した後にswitch文から抜けるようにしています。breakがないと、意図せず次のcaseの処理まで実行される「フォールスルー」が発生します。

フォールスルーの活用例

フォールスルーとは、複数のcaseに対して同じ処理を行いたい場合に、break文をあえて省略する手法です。たとえば、試験の成績に応じたメッセージを表示する場合、B評価とC評価で同じ処理を行うときに便利です。

php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
$grade = "B";

switch ($grade) {
    case "A":
        echo "素晴らしい成績です!";
        break;
    case "B":
    case "C":
        // case "B"からcase "C"へフォールスルーして同じメッセージを表示
        echo "まずまずの成績です。";
        break;
    case "D":
        echo "もう少し頑張りましょう。";
        break;
    default:
        echo "評価対象外です。";
        break;
}
実行結果
1
まずまずの成績です。

この例では、$gradeが"B"の場合、case “B"に一致し、そのままbreakに到達せずにcase “C"の処理へフォールスルーして「まずまずの成績です。」と表示されます。B評価とC評価をまとめて同じ処理にしたいときに、switch文のフォールスルーは非常に有用です。

switch (true) を使った厳密な比較の方法

通常の switch 文は ==(等価演算子)による比較を行うため、型が異なっていても比較が成立してしまうことがあります。しかし、switch (true) を使うことで、case の条件を true に統一し、各ケースで ===(厳密比較)を使って明示的に条件を設定できます。

switch (true) を使った厳密な型チェック

通常の switch 文では、PHPは ==(等価比較)を行うため、整数 1 と文字列 "1" を同じと見なしてしまいます。しかし、switch (true) を使うことで、型を厳密にチェックできます。

通常の switch 文との違い

まず、通常の switch 文での動作を見てみましょう。

php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
$value = "1";

switch ($value) {
    case 1:
        echo "case 1: 整数の1として扱われました。";
        break;
    case "1":
        echo "case \"1\": 文字列の1として扱われました。";
        break;
    default:
        echo "どちらでもありません。";
        break;
}
実行結果
1
case 1: 整数の1として扱われました。

このように、文字列 "1" を代入していても case 1 にマッチしてしまいます。これは switch 文が == を使って比較するため、"1" == 1true になるからです。

switch (true) を使って厳密に比較する

php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
$value = "1";

switch (true) {
    case $value === 1:
        echo "case 1: 整数の1として扱われました。";
        break;
    case $value === "1":
        echo "case \"1\": 文字列の1として扱われました。";
        break;
    default:
        echo "どちらでもありません。";
        break;
}
実行結果
1
case "1": 文字列の1として扱われました。

この書き方では、switch (true) にすることで case の条件を明示的に true に固定し、それぞれの case 内で ===(厳密比較)を行うことができます。そのため、$value の型が一致しない場合、意図しないマッチが発生しません。

switch (true) を使うメリット

1. 厳密な型チェックができる

通常の switch 文は == による比較を行うため、型が異なっていても意図しないマッチが発生することがあります。しかし、switch (true) を使うことで、各 case=== を使った厳密な型チェックが可能になります。

2. より柔軟な条件分岐が可能

通常の switch 文では変数の値と case の値を直接比較しますが、switch (true) を使うことで、case に複雑な条件を設定できます。

例:数値の範囲判定

php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
$score = 85;

switch (true) {
    case $score >= 90:
        echo "成績: A";
        break;
    case $score >= 80:
        echo "成績: B";
        break;
    case $score >= 70:
        echo "成績: C";
        break;
    default:
        echo "成績: D";
        break;
}
実行結果
1
成績: B

このように switch (true) を使えば、数値の範囲に応じた条件分岐を簡潔に記述できます。通常の switch 文ではこのような範囲判定を行うのは難しいため、switch (true) の方が適しています。

switch (true) を使うべき場面と注意点

switch (true) を使うべき場面

  • 厳密な型比較が必要な場合=== を使いたい場合)
  • 数値の範囲判定を行いたい場合
  • 複数の異なる条件を判定したい場合(特定の変数の値だけでなく、複雑な条件を含めたいとき)

switch (true) を使う際の注意点

  • switch (true) を使うと、case で直接条件式を書くことになるため、通常の switch 文より if-elseif 文に近い形になります。そのため、単純な値のマッチングだけで済む場合は、通常の switch 文を使う方が可読性が高くなります。
  • switch (true) は便利ですが、極端に多くの case 条件を入れると可読性が悪くなるため、複雑な条件の場合は if-elseif 文を使う方が分かりやすくなることもあります。

まとめ

  • 通常の switch 文では == による緩い比較が行われるため、型の違いによる意図しないマッチングが発生することがある。
  • switch (true) を使うことで、各 case===(厳密比較)を使用し、型の違いによる誤判定を防げる。
  • switch (true) は数値の範囲判定など、複雑な条件をシンプルに記述するのにも適している。
  • ただし、switch (true)if-elseif 文と似た動作になるため、単純な値の比較なら通常の switch 文を使った方が可読性が良い。

PHPの switch 文は状況によって使い分けが必要です。特に、型の違いによる意図しない比較ミスを防ぐために、switch (true) を活用するのは有効な手法の一つです。ぜひ実際に試して、適切な使い分けをマスターしてください!

if文については下記記事をお読みください。
PHPのifステートメント:初心者向けガイド


スポンサーリンク

共有

もふもふ
著者
もふもふ
プログラマ。汎用系→ゲームエンジニア→Webエンジニア→QAエンジニア