PHP
値が異なるのに比較演算子「==」で比較するとtrueが戻る
ぽんて
公開日:2022/06/28
発生した現象
皆さんはvar_dumpで何が出力されるかわかるでしょうか。
1 2 3 4 5 6 |
$num = 0; $ret = 'こんにちは'; if($num == 'hoge'){ $ret = 'こんばんは'; } var_dump($ret); //これがなにを出力するか |
正解は「こんばんは」です!
え??if内は「0 == ‘hoge’」で値が異なるから出力は「こんにちは」じゃないの?
と思われた方もいらっしゃると思います。
なぜこのような結果になるのでしょうか。
原因
PHPでは「’hoge’」を「(int)’hoge’」に変換し比較されていることが原因です。
「0 == ‘hoge’」は、次のような処理がPHP内部で行われています。
※あくまでイメージです。またPHPのverによっても異なります
- 0の型を確認 →int
- ’hoge’の型を確認 →string
- 型が違うということは「0 === (int)’hoge’)」で比較だ! (1==’1’ならこれでうまくいく)
- (int)’hoge’ → 0
- 「0 == ‘hoge’」 → 「0 === 0」
- 結果:0 == ‘hoge’はtrue
つまり「 0 == ‘hoge’」→「 0 === (int) ‘hoge’」→「 0 === 0」となり、クイズでのif文内はtureとなります。
結論
不要なバグを減らすために基本は「==」は使わず「===」を使っていきましょう!