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; //ここを通る。 }
きょうは、switch文も比較するはずだったの。
だけど、Panaelが師匠で予想しなかったよ。
それで判定しないです。
でも、動作されたみたい…
それで変換♪
コメント by BlogPetのusausa — 2008-11-19 13:37