PHPにも多くの言語と同様、switch
文があります。ただし、注意すべき点がいくつかあります。
構文とフォールスルー
PHPのswitch
は、C言語と同様な構文になっています。
switch(式){
case 値1:
実行される文;
break;
case 値2:
実行される文;
break;
default:
実行される文;
break;
}
上の文を見ればわかるように、各所にbreak;
が入っています。C言語と同様、PHPもcase
へは飛ぶだけで次のがあっても実行されてしまうので、次のところへ実行が進まないようにするにはbreak;
が必要です。逆に、もし意図的に複数のcase
を続けて実行する場合には、その旨コメントを入れておいたほうがいいでしょう。
値の比較
公式のマニュアルでもさらっとだけ触れられていますが、switch
での比較は、緩やかな比較(==
演算子と同様な比較)です。端的な例としては、
switch($x){
case true:
//ここには$xがtruthyなときに来る
break;
case false:
//ここには$xがfalsyなときに来る
break;
default:
//絶対にたどり着かない
}
というようになります。基本的に、case
で書くものは型を揃えるようにして、そして整数であればswitch((int)$x)
のようにキャストすることで、曖昧な比較の弊害を回避できます。文字列の場合、"3"=="3.0"
なので、数値として認識されないように、switch("#$x")
のように先頭へ何か文字を付けて、case
にもそれ付きで書くという手段を取らないと問題は残ってしまいます。
case
に書けるもの
C言語では、case
の後には定数式しか書けませんでしたが、PHPでは任意の式を書くことができます。これを積極的に利用する例として、(賛否両論はありますが)switch(true)と書くことで、最初に真となったものを選ぶなんていう書き方もできてしまいます。
continue
配列の各要素に対して評価を加えるなどで、for
の中でswitch
を使うことがあるかもしれません。そのような場面で、switch
の中でcontinue
を使うと、そのcontinue
はswitch
に対して働いて、break
と同じ扱いとなってしまいます(PHPマニュアル)。continue 2;
として、外側のループへの適用を明記する必要があります。