比较string与整数给出奇怪的结果

我真的很困惑,为什么这个操作的作品。 有人可以解释吗?

$test1 = "d85d1d81b25614a3504a3d5601a9cb2e"; $test2 = "3581169b064f71be1630b321d3ca318f"; if ($test1 == 0) echo "Test 1 is Equal!?"; if ($test2 == 0) echo "Test 2 is Equal!?"; // Returns: Test 1 is Equal!? 

澄清,我想比较string"0" $testvariables。 我已经知道修复代码,我可以附上(我应该有)在0

我想知道这是一个PHP错误,服务器错误,或者某种有效的操作。 根据http://us3.php.net/types.comparisons这应该工作。

编辑:划痕,显然它确实提到,string和0之间的松散比较是真实的。 但我仍然不知道为什么。

编辑2:我已经修改了我的问题,为什么$test2"3581169b064f71be1630b321d3ca318f"不起作用?

从PHP手册 :

string转换为数字

当在数值上下文中计算string时,结果值和types如下确定。

如果string包含任何字符“。”,“e”或“E”,则该string将被评估为浮点数。 否则,它将被评估为一个整数。

该值由string的起始部分给出。 如果string以有效的数字数据开始,则这将是使用的值。 否则,该值将是0(零)。 有效的数字数据是一个可选符号,后跟一个或多个数字(可选地包含一个小数点),后跟一个可选的指数。 指数是一个“e”或“E”,后跟一个或多个数字。

使用==运算符进行types转换

==运算符是一个松散types的比较。 它将转换为一个普通的types,并进行比较。 这里解释了string转换为整数的方式。

请注意, 您链接到的页面并不矛盾。 检查第二个表,它表示将整数0与使用==的string"php"进行比较应该是true。

会发生什么是string转换为整数,并且非数字string(不包含或以数字开头的string)将转换为0

数字与非数字string

由数字组成的string或以数字开头的string被视为数字string 。 如果string在该数字后面有其他字符,则忽略这些字符。

如果一个string以一个不能被解释为数字的一部分的字符开始,那么它是一个非数字的string ,并将转换为0 。 这并不意味着数字string必须以数字(0-9)开始 – 例如"-1"是数字string,因为在这种情况下,减号是数字的一部分。

因此,例如,您的string"d85d1d81b25614a3504a3d5601a9cb2e"不以数字开头,所以它会转换为0 。 但是你的第二个string"3581169b064f71be1630b321d3ca318f"将被转换为整数3581169 。 所以这就是为什么你的第二个testing不能以相同的方式工作。

你应该做什么

你可能想要:

 if ($test1 === "0") 

请注意,使用三等于而不是等于两倍。 这可以确保您所比较的是仅包含数字零的string,并防止任何types转换。

经过一番调查,从PHP手册中发现aidan提到, 任何不以数字开头的string在转换为整数时都会被转换为0。

这意味着:

 ("php" == 0) === true ("1php" == 0) === false 

非常讨厌,没有很好的文件。 它在types比较页面的评论底部。

 $test1 = "d85d1d81b25614a3504a3d5601a9cb2e"; 

这个string以“d”开头,这个数字不是有效的,var将会parsing为0,并且testing#1会通过。

 $test2 = "3581169b064f71be1630b321d3ca318f"; 

这个string以3581169开始,这是一个有效的数字,所以var将parsing为不等于0的值。所以你的testing#2将不会通过。

我一直在使用一些转换和比较来testing一个数字string是否是一个数字:

 $test1="19de6a91d2ca9d91721d82f1bd8102b6"; echo (float)$test1==$test1; //TRUE echo is_float($test1); //FALSE //Converting the string to float and then converting it to string and compare will do the trick echo (string)((float)$test1)==(string)$test1; //FALSE $test2="5.66"; echo (float)$test2==$test2; //TRUE //Testing the numeric string using `is_float` wont give the expected result echo is_float($test2); //FALSE echo (string)((float)$test2)==(string)$test2; //TRUE