PHPのSwitch文がうまく動かないときに確認すること




PHPのSwitch文で期待しない動作に悩む事があると思います。そんな場合に確認したいことについて書きました。

breakを忘れていないか

<?php
$i = -1;
switch($i){
  case $i <  0:
  echo("負の値です");
  case $i > 0:
  echo("正の値です");
}
 ?>

//結果
//負の値です
//正の値です

switch文はbreakに遭遇するか、一番最後に到達するまで実行を続けます。上記の例では、$iは-1という負の値ですが、breakが設定されていないため”正の値です”という文章も出力されてしまいます。

意図的にbreakを省略することもありますが、breakを入れ忘れてしまってエラーに悩んだ経験があるので備忘録として書いておきました。

緩やかな比較による予想外な動作

上記の書き方のSwitch文では、条件判定に緩やかな比較を採用しています。では、例えば次のようなコードを考えてみましょう.

<?php
$i = "-1です";
switch($i){
  case -1:
  echo("数字です");
  break;
  case "-1です":
  echo("文字です");
  break;
}
 ?>

//結果
//数字です

これを実行すると、PHPが元のテキスト”-1です”を数字に自動キャストしてしまいます。Switch文の緩やかな比較ではこのような予期せぬ結果になることがあります。期待通りの結果を得るためには、以下のように厳密な比較を行います。

<?php
$i = -1です;
switch(true){
  case $i === -1:
  echo("数字です");
  break;
  case $i === "-1です":
  echo("文字です");
  break;
}
 ?>

PHPは緩やかな比較が予期しない動作を生みがちです。Switch文を使うときも、この点に注意することが大事だと思いました。