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;として、外側のループへの適用を明記する必要があります。