不同PHP服务器中字符串的PHP比较
我在服务器中有一个php,我发现了一个问题(已解决)。这个问题是在一个比较长的整数之间保存在一个字符串和我不能使用相等,我必须使用相同的。但我不知道为什么我必须使用它,如果它是对字符串的比较 我做了一个测试,在本地主机和服务器上得到了两个不同的结果 服务器PHP版本:5.3.10-1ubuntu3.10 本地PHP版本:5.6.30-7+deb.sury.org~xenial+1 以下是mi代码:不同PHP服务器中字符串的PHP比较,php,string,comparison,Php,String,Comparison,我在服务器中有一个php,我发现了一个问题(已解决)。这个问题是在一个比较长的整数之间保存在一个字符串和我不能使用相等,我必须使用相同的。但我不知道为什么我必须使用它,如果它是对字符串的比较 我做了一个测试,在本地主机和服务器上得到了两个不同的结果 服务器PHP版本:5.3.10-1ubuntu3.10 本地PHP版本:5.6.30-7+deb.sury.org~xenial+1 以下是mi代码: <?php $a = "1285615000003961035"; $b =
<?php
$a = "1285615000003961035";
$b = "1285615000003961023";
if($a == $b)
{
echo "$a == $b<br>";
}
else
{
echo "$a != $b<br>";
}
if((string)$a == (string)$b)
{
echo "(string)" . (string)$a . " == (string)" . (string)$b . "<br>";
}
else
{
echo "(string)" . (string)$a . " != (string)" . (string)$b . "<br>";
}
if($a === $b)
{
echo "$a === $b<br>";
}
else
{
echo "$a !== $b<br>";
}
if((string)$a === (string)$b)
{
echo "(string)" . (string)$a . " === (string)" . (string)$b . "<br>";
}
else
{
echo "(string)" . (string)$a . " !== (string)" . (string)$b . "<br>";
}
?>
在服务器中,我得到:
128561500003961035==128561500003961023
(字符串)128561500003961035==(字符串)128561500003961023
128561500003961035!==128561500003961023
(字符串)128561500003961035!==(字符串)128561500003961023
在本地:
128561500003961035!=128561500003961023
(字符串)128561500003961035!=(字符串)128561500003961023
128561500003961035!==128561500003961023
(字符串)128561500003961035!==(字符串)128561500003961023根据发行说明,自PHP5.4以来,由于浮点数的内部表示方式,溢出到浮点数中的整数字符串将不再被视为相等 有关更多信息,请参阅以下链接: (示例后的警告部分)
您应该使用strcmp或===来比较字符串(正如您所使用的),因为当您使用==时,PHP将进行类型转换
编辑:正如卢卡斯·门德斯(Lucas Mendes)在上文所述,在PHP 5.4之后,这只是部分正确,但使用默认情况下不进行类型转换的运算符来比较字符串更安全。我在7.0.15-1~dotdeb+8.1中测试了这段代码,它与您的本地结果相同。我认为在5.3和5.6之间有些变化。一般来说,在PHP中精确比较大(长)数是一场噩梦,应该不惜一切代价避免。@DmitryPonkin我知道我必须避免它。但这是必要的,因为这些大数字是来自外部服务的id,我没有其他选择。