まえがき
PHPでプログラムを作成する際、条件分岐は欠かせない重要な要素のひとつです。
一般的にif文を使って条件を分岐させることが多いですが、条件の数が増えるとコードが長くなり、可読性が低下してしまうことがあります。
そこで活躍するのがswitch文です。
switch文を使えば、特定の変数の値に応じて複数の処理を簡潔に記述できます。
特に、同じ処理を複数の条件で実行する場合には、「フォールスルー」を活用することで、さらにスッキリしたコードを書くことが可能です。
本記事では、PHPのswitch文の基本構文から、フォールスルーの活用方法、型の比較の注意点まで、初心者の方にも分かりやすく解説します。
サンプルコードはPHP Playground で実行できます。
switch文の基本構文
PHPのswitch文は、ある変数の値に応じて複数の処理を分岐させるための構文です。if文を使って複数の条件をチェックする方法もありますが、条件が多くなる場合、switch文を使うとコードがすっきりまとまります。
基本的な構文は以下のとおりです。
| |
各caseの末尾に必ずbreakを記述することで、そのcaseの処理が完了した後にswitch文から抜けるようにしています。breakがないと、意図せず次のcaseの処理まで実行される「フォールスルー」が発生します。
フォールスルーの活用例
フォールスルーとは、複数のcaseに対して同じ処理を行いたい場合に、break文をあえて省略する手法です。たとえば、試験の成績に応じたメッセージを表示する場合、B評価とC評価で同じ処理を行うときに便利です。
| |
| |
この例では、$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 文での動作を見てみましょう。
| |
| |
このように、文字列 "1" を代入していても case 1 にマッチしてしまいます。これは switch 文が == を使って比較するため、"1" == 1 が true になるからです。
switch (true) を使って厳密に比較する
| |
| |
この書き方では、switch (true) にすることで case の条件を明示的に true に固定し、それぞれの case 内で ===(厳密比較)を行うことができます。そのため、$value の型が一致しない場合、意図しないマッチが発生しません。
switch (true) を使うメリット
1. 厳密な型チェックができる
通常の switch 文は == による比較を行うため、型が異なっていても意図しないマッチが発生することがあります。しかし、switch (true) を使うことで、各 case で === を使った厳密な型チェックが可能になります。
2. より柔軟な条件分岐が可能
通常の switch 文では変数の値と case の値を直接比較しますが、switch (true) を使うことで、case に複雑な条件を設定できます。
例:数値の範囲判定
| |
| |
このように 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ステートメント:初心者向けガイド