Edited at

PHPのswitchは要注意

More than 3 years have passed since last update.

PHPにも多くの言語と同様、switch文があります。ただし、注意すべき点がいくつかあります。


構文とフォールスルー

PHPのswitchは、C言語と同様な構文になっています。


switch構文

switch(){

case 値1:
実行される文;
break;
case 値2:
実行される文;
break;
default:
実行される文;
break;
}

上の文を見ればわかるように、各所にbreak;が入っています。C言語と同様、PHPもcaseへは飛ぶだけで次のがあっても実行されてしまうので、次のところへ実行が進まないようにするにはbreak;が必要です。逆に、もし意図的に複数のcaseを続けて実行する場合には、その旨コメントを入れておいたほうがいいでしょう。


値の比較

公式のマニュアルでもさらっとだけ触れられていますが、switchでの比較は、緩やかな比較==演算子と同様な比較)です。端的な例としては、


trueとfalseを指定すると

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を使うと、そのcontinueswitchに対して働いてbreakと同じ扱いとなってしまいます(PHPマニュアル)。continue 2;として、外側のループへの適用を明記する必要があります。