【php】==演算子、===演算子、数値と文字列の比較などに関して
問題
比較において、10 == ’10’ → true、10 == ‘10.0’ → true、10 == ‘010’ → true、10 == ‘1e1’ → true、10 == ‘0xa’ → true となる問題について。
いろいろなルールがある。
http://www.php.net/manual/ja/language.operators.comparison.php
いろいろな変換をしてくれる。
http://www.php.net/manual/ja/language.types.string.php#language.types.string.conversion
Perlでは数値として比較したいときに == を使う。文字列として比較したいときは eq を使う。Perlでも==を使うとphpと似たような問題が発生するが、eq を使うべしということがよく知られているので、あまり問題にならないようだ。
では、phpだとどうしたらいい?
やってみた
こんな簡単なことでもおかしな結果になる。
<?php $x = $_REQUEST['x']; if ($x == 10) { echo 'xは10でした'; } else { echo 'xは10ではありませんでした'; }
test.phpが上の内容だとする。次のURLにアクセスしてみると?
- 1、http://example.com/path/to/test.php?x=10
- 結果: xは10でした // これは問題ない
- 2、http://example.com/path/to/test.php?x=010
- 結果: xは10でした // 頭の0の有無が影響する処理だとよろしくない。影響しない場合はありがたい。
- 3、http://example.com/path/to/test.php?x=0x10
- 結果: xは10ではありませんでした // 良い結果のように見えるが
- 4、http://example.com/path/to/test.php?x=0xa
- 結果: xは10でした // 16進数として解釈しましたね
- 5、http://example.com/path/to/test.php?x=1e1
- 結果: xは10でした // 浮動小数点数として解釈しましたね
- 6、http://example.com/path/to/test.php?x=10zzz
- 結果: xは10でした // いやそれはやめて欲しい
$x == 10
と書いたのが間違いで $x == '10'
と書くべきだったのかと言うと、それでは6が解決するだけで、2、4、5は解決しない。
何が問題かというと、比較の対象が数値もしくは数値の姿をした文字列だと、==演算子を使ったときいろいろな変換をしてくれること。
なので
数値もしくは数値っぽい文字列が入る部分では==による型変換に注意する。
絶対文字列同士の比較になる部分では === を使う(パスワードの比較など)。
コメント