プロが教える店舗&オフィスのセキュリティ対策術

$a = 0;

if ($a == "hoge"){ echo "a"; }
elseif($a == 0) { echo "b"; }
else { echo "c"; }

//-----
true,falseならcを吐きそうだし。
なぜでしょうか。

A 回答 (5件)

??


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

この回答への補足

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

補足日時:2009/03/15 10:32
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/15 10:34

あ、ごめんなさい。

PHPね
http://logic.stepserver.jp/memo.cgi/archive/506/
を見てください
    • good
    • 0

これは。

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

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

お礼日時:2009/03/15 11:07

さらにこういう話もあったり。



PHPで==の代わりにstrcmp関数を使うことによる問題点 - hnwの日記
http://d.hatena.ne.jp/hnw/20090123
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/15 11:15

>phpて融通利く言語だと思ってた



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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!