LoginSignup
7
7

More than 5 years have passed since last update.

PHPのswitchは要注意

Last updated at Posted at 2015-07-05

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

7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7