整数字符串比较相等(PHP bug?)

时间:2011-11-10 16:40:01

标签: php

我正在比较两个字符串:

<?php

$Str1 = '111122223333444455556666';
$Str2 = '111122223333444455557777';

if($Str1 != $Str2){
    // Do something
} else {
    // Do something else
}

?>

显然,$ Str1与$ Str2不同,但仍然总是执行else-block。我知道我应该简单地使用===!==进行比较,但我想知道为什么(基本上)我尝试的任何其他值实际上都会评估它的预期方式。

我还在文档“如果字符串不包含任何字符'。','e'或'E'中读到这个,并且数值适合整数类型限制(由PHP_INT_MAX定义), string将被评估为一个整数。“,所以我猜它不应低于或等于PHP_INT_MAX的值(远远小于我上面评估的字符串) - 假设这是他们的意思“适合”。那么为什么上面的字符串被评估为相同?它可能是一个PHP错误还是我缺少的东西?


我从昨天起使用PHP版本5.3.8,来自PHP 5.3.6。在Windows XP上运行。

4 个答案:

答案 0 :(得分:7)

这里发生的是数字被转换为浮点数(因为它们不适合整数)并且浮点数恰好相同。请参阅the PHP source

This script表明解析后的浮点确实具有相同的值。

答案 1 :(得分:1)

如果我这样做,那就是它的样子:

$Str1 = '111122223333444455556666 '; 
$Str2 = '111122223333444455557777 ';

它很好(注意空格)

所以它必须转换为数字,而不是因为长度

而看到差异

答案 2 :(得分:1)

有人可以认为PHP在这些转换中有点放松了吗?! 那么,您是否更愿意进行良好的旧严格类型检查?

不像上面那样先进,但仍然足以在最近抓住一小时的时间。

<? 
$a_var = 0;
if ($a_var=="WHATEVER")
  echo "WATCH OUT! This will be printed!";
//- as "whatever" is converted to an int

if ((string)$a_var=="WHATEVER")
  echo "OK, this will of course not be printed!";

$a_var = "0";
if ($a_var=="WHATEVER")
  echo "OK, this will of course also not be printed!";
?>

结论:请注意PHP中的自动转换。 它可能偶尔会对你起作用,而且可能很难跟踪错误。 显式铸造一次太多可能有时更聪明,而不是依赖我们对PHP的理解。 ; - )

答案 3 :(得分:1)

使用

if (strcmp($Str1, $Str2) == 0) {
    //equal
} else {
    //not equal
}

https://docstore.mik.ua/orelly/webprog/php/ch04_06.htm中所述,首先将两者比较为String然后比较为0是否相等。