我正在比较两个字符串:
<?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上运行。
答案 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是否相等。