2011-11-10 46 views
7

我比较两个字符串,像这样:整数字符串比较是相等的(PHP错误?)

<?php 

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

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

?> 

显然,$ str1和不一样的$ STR2,但仍始终执行else区块。我知道我应该简单地使用===!==来比较这里,但我想知道为什么(基本上)我尝试的任何其他值实际上评估它的预期方式。

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


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

+0

我不能在我的5.3.5安装中重新创建它。字符串比较为“不等于”和“不不等于”。 –

+0

我在PHP 5.2.5(http://codepad.org/BJZT1KM1)和PHP 5.3.9-dev(http://codepad.viper-7.com/MxwYQw)上重新创建了它。 –

回答

7

这里发生的事情是数字被转换为浮点数(因为它们不适合int),浮点数恰好相同。见the PHP source

This script显示解析后的浮动确实具有相同的值。

+0

多么奇怪的现象。我试图弄清楚(显然在一个更复杂的脚本)几个小时,事实证明这是唯一的问题。有时候PHP可以真正让你感到尴尬。这回答了我的问题 - 这是一个很好的答案。谢谢! – user966939

1

那是什么样子,如果我这样做:

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

它配备了罚款(注意空格)

所以它必须被转换为数字并没有看到,因为长度的差异

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中的自动铸件。 它可能会时不时玩弄你,并且bug可能很难跟踪。明确投射一次太多时,可能会更聪明,而不是依靠我们伟大的PHP理解。 ;-)

+0

OMG这让我疯狂!我有'if($ var ==“E”){echo“这在$ var是int(0)时打印”; }' – SublymeRick