トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

PHP、文字列比較で「==」は禁止!

[カテゴリ:PHP]

PHP、文字列比較で「==」は禁止!(2007/10/06)

php数年やってますが、知らなかったという話。
単に私の知識不足なのかもしれませんが、
おそらく知らない人の方が圧倒的に多いと思う(妄想?)ので、
もっと宣伝?すべきだと思う。

結論から言うと、
文字列比較に「==」を使ってはいけません!
絶対に「===」を使いましょう。

ネタ元は、
がるの健忘録 - 素晴らしき自動的な世界〜或いは「型のない」世界〜:
http://d.hatena.ne.jp/gallu/20061108/p1

ようは「==」と「===」の違いの話、そんなことはわかってる。
数値対文字列で比較してるから、想定しづらい状況になってるだけで
型を意識しておけばよいこと。(だとこのときは思ってた)

ところが、上記ネタ元のコメント欄みて愕然とした。

文字列対文字列の比較なら「==」で比較しても何ら問題ない。
と思っていませんか?
私は思ってました。

しかし、それは間違いなんです。
なぜならPHPでは ('100' == '10e1') が true になってしまうから。
なぜならPHPでは ('100' == '100.0') が true になってしまうから。
なぜならPHPでは ('100' == '0100') が true になってしまうから。

PHP: 比較演算子 - Manual:
http://www.php.net/manual/ja/language.operators.comparison.php

数値形式の文字列を比較する場合、それは整数として比較されます。

これはかなりショックです。

文字列対文字列の比較であっても、数値と解釈できるとき
(is_numericでtrueになるかどうかってことかな)には
数値対数値 で評価されてしまうんですね。

「===」もしくはstrcmpを使いましょう。

$ echo "<?php var_dump(array('100' == '10e1', '100' == '10e1 ', '100' === '10e1' )); ?>" | php
array(3) {
  [0]=>
  bool(true)   <--- '100' == '10e1'
  [1]=>
  bool(false)  <--- '100' == '10e1 '
  [2]=>
  bool(false)  <--- '100' === '10e1'
}
<?php

// 文字列、数字 比較
$a = "10xxxx";
$b = 10;
if ($a == $b)         { echo "hita\n"; }    // hit
if ($a === $b)        { echo "hitb\n"; }
if (!strcmp($a, $b))  { echo "hitc\n"; }

// 文字列、文字列 比較
$a = "10000 ";
$b = "10000";
if ($a == $b)         { echo "hitd\n"; }
if ($a === $b)        { echo "hite\n"; }
if (!strcmp($a, $b))  { echo "hitf\n"; }

// 文字列、文字列 比較
$a = "10e3";
$b = "10000";
if ($a == $b)         { echo "hitg\n"; }    // hit
if ($a === $b)        { echo "hith\n"; }
if (!strcmp($a, $b))  { echo "hitj\n"; }

$a = 10;
if (is_string($a))  { echo "hitk\n"; }
if (is_int($a))     { echo "hitl\n"; }  // hit
if (is_float($a))   { echo "hitm\n"; }
if (is_numeric($a)) { echo "hitn\n"; }  // hit

$a = "10xxx";
if (is_string($a))  { echo "hito\n"; }  // hit
if (is_int($a))     { echo "hitp\n"; }
if (is_float($a))   { echo "hitq\n"; }
if (is_numeric($a)) { echo "hitr\n"; }

$a = "10e3";
if (is_string($a))  { echo "hits\n"; }  // hit
if (is_int($a))     { echo "hitt\n"; }
if (is_float($a))   { echo "hitu\n"; }
if (is_numeric($a)) { echo "hitv\n"; }  // hit

?>

2007/11/10追記

PHP勉強会/さまざまな値の比較表 - GANAWARE-wiki
http://pukiwiki.hnw.jp/index.php?PHP%CA%D9%B6%AF%B2%F1%2F%A4%B5%A4%DE%A4%B6%A4%DE%A4%CA%C3%CD%A4%CE%C8%E6%B3%D3%C9%BD

最終更新時間:2007年11月10日 22時32分07秒