• ベストアンサー

仕様ならしようがない(洒落)

$a = 0; if ($a == "hoge"){ echo "a"; } elseif($a == 0) { echo "b"; } else { echo "c"; } //----- true,falseならcを吐きそうだし。 なぜでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

さらにこういう話もあったり。 PHPで==の代わりにstrcmp関数を使うことによる問題点 - hnwの日記 http://d.hatena.ne.jp/hnw/20090123

mpqfiogwd
質問者

お礼

はうあっ -o-;) phpて融通利く言語だと思ってたけど、なんかイメージ変わりました。。 有意義なご回答どもでした!

その他の回答 (4)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.5

>phpて融通利く言語だと思ってた 融通効かせて、文字列を数値に自動変換して比較するから、0 == "数字以外文字列何でも" や "1半角数字から"==1 はtrue になっちゃうんです。 strcmp() は逆に、数値を文字列に自動変換して、思わぬ結果になったりする。 phpもperlもJavaScriptも、一つの変数にどんな型のデータでも代入できる代わりに、その文脈で(数値判定するか文字列として必要かで)結果が変わってくるので、融通の法則(自動変換の法則)を覚えないと正しい結果を得られません。 phpでの変換の法則はマニュアル参照 http://jp.php.net/manual/ja/language.types.string.php#language.types.string.conversion いずれにしても、型を区別して比較するなら、===とか!==かで、数値を文字列に直すならsprintfでフォーマットをそろえるとかいろいろ方法はそろってます。

回答No.3

これは。。。 3行目で、strcmp()で文字列比較してください。 参考はこれ。 http://logic.stepserver.jp/memo.cgi/archive/506/

mpqfiogwd
質問者

お礼

さすがですねー。対応完了です。理解しました。

noname#96023
noname#96023
回答No.2

あ、ごめんなさい。PHPね http://logic.stepserver.jp/memo.cgi/archive/506/ を見てください

noname#96023
noname#96023
回答No.1

?? $a == "hoge" →false $a == 0   →true よって出力は「b」なのでは

mpqfiogwd
質問者

お礼

説明に書いてないけどaが出力されます。

mpqfiogwd
質問者

補足

そうならないと困るんですが、、 phpは5.1.6です。自分だけかな。

関連するQ&A