这是因为类型杂耍,这意味着字符串可以用作数字,并且您正在使用“松散等于”比较运算符 ==
。
如果一个表达式的操作数是一个数字(即包含数字并且可以被认为是一个数字),那么它将在被比较之前被转换为适当的数字类型(integer
或float
)。所以,这就是 PHP 实际看到以下表达式的方式:
("+494321" == "00494321") => (494321 == 494321)
第一个操作数去掉了加号(它只是意味着数字是正数),第二个操作数的零被截断了(它们并不真正意味着任何东西;即07
,7
它们都是相同的十进制数,只是表示方式略有不同)。
如果你想准确地比较两个字符串,那么有几种方法可以做到这一点。第一种是简单地使用“完全等于”运算符===
。使用此运算符,操作数将永远不会被类型杂耍,也就是说比较运算符的两侧将完全匹配;字符串将是字符串,整数将是整数,依此类推。
例如,这两个表达式都等于false
:
"123" === 123
"006" === 6
另一种方法是使用strcmp
函数(或类似的相关函数)。它逐字节比较字符串:
$a = "+494321";
$b = "00494321";
if (strcmp($a, $b) === 0) {
echo "The same";
} else {
echo "Not the same";
}
0
如果两个字符串之间没有差异(即差异为零),则该函数返回。如果返回的数字小于或大于0
则两个字符串不相同。