不同php服务器中字符串之间的PHP比较

时间:2017-03-20 16:59:49

标签: php string comparison

我在服务器上有一个PHP,我发现了一个问题(已解决)。问题在于对字符串中保存的长整数进行比较而我不能使用Equal,我必须使用Identical。但我不知道为什么我必须使用它,如果它是字符串之间的比较。

我做了一个测试,在本地主机和服务器上得到了两个不同的结果。

服务器PHP版本:5.3.10-1ubuntu3.10

本地PHP版本:5.6.30-7 + deb.sury.org~xenial + 1

这是mi代码:

<?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>";
    }

    ?>

在服务器中我得到:

1285615000003961035 == 1285615000003961023

(string)1285615000003961035 ==(string)1285615000003961023

1285615000003961035!== 1285615000003961023

(string)1285615000003961035!==(string)1285615000003961023

并在当地:

1285615000003961035!= 1285615000003961023

(string)1285615000003961035!=(string)1285615000003961023

1285615000003961035!== 1285615000003961023

(string)1285615000003961035!==(string)1285615000003961023

2 个答案:

答案 0 :(得分:3)

自PHP 5.4起,根据发行说明,溢出为浮点数的整数字符串将不再被视为相等,因为浮点数的表示方式在内部。

有关详细信息,请参阅以下链接:

http://php.net/manual/en/language.operators.comparison.php(示例后的警告部分) http://php.net/manual/en/types.comparisons.php#108264

答案 1 :(得分:0)

您应该使用strcmp或===来比较字符串(如您所用),因为当您使用== PHP时会进行类型转换。

http://php.net/manual/en/language.operators.comparison.php

编辑:正如Lucas Mendes所述,在PHP 5.4之后,这只是部分正确 - 但是使用默认情况下不进行类型转换的运算符来比较字符串仍然更安全。