SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【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は解決しない。

何が問題かというと、比較の対象が数値もしくは数値の姿をした文字列だと、==演算子を使ったときいろいろな変換をしてくれること。

なので

数値もしくは数値っぽい文字列が入る部分では==による型変換に注意する。

絶対文字列同士の比較になる部分では === を使う(パスワードの比較など)。

関連するメモ

コメント