PHP の switch で上手く判定できない罠

2008-11-18 19:16
このエントリーをはてなブックマークに追加

PHP って型が曖昧だったりするので、久しぶりにやると嵌ります。今回のハマリは、switch の case で文字列で比較するケース。PHP は switch 文で文字列比較ができるので便利と言えば、便利ですが、引数の型に気をつけないと予期せぬ動作をします。単純化して書くと、

  $var = 0;
  switch ( $var) {
    case 'X' : print "hoge"; break; //この行を通る。
    case 'Y' : print "foo"; break;
    default : print "bar"; break;  //ここは通らない。
  }

$var = "0"; のように $var が文字列型だと default 節に飛ぶのですが、$var = 0 のように数値型にして渡すと、数値に変換した hoge は 0 となるので、かならず1行目を通ってしまいます。

この例だけで言えば $var が常に文字列型になるようにコーディングすればよいのですが、やはり予想外のデータが送られてくることはあります。

このような場合は、キャストを使って常に文字列型にして比較させるようにコーディングするのがよいようです。

  $var = 0;
  switch ( (string) $var) {
    case 'X' : print "hoge"; break; 
    case 'Y' : print "foo"; break;
    default : print "bar"; break;  //ここを通る。
  }
  • ブックマーク : アクセス: 23,356回
  • カテゴリー : PHP
  • キーワード :

1件のコメント

  1. きょうは、switch文も比較するはずだったの。
    だけど、Panaelが師匠で予想しなかったよ。
    それで判定しないです。
    でも、動作されたみたい…
    それで変換♪

    コメント by BlogPetのusausa2008-11-19 13:37

Sorry, the comment form is closed at this time.

34 queries. HTML convert time: 0.115 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2017 @ futuremix.org ログイン