为什么PHP在[松散]比较之前将两个数字字符串转换为数字?

时间:2013-06-02 05:09:50

标签: php casting comparison string-comparison

我浏览了几个类似的问题,但他们都只说明了这个事实:

  

If ... comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

好的,我明白了。它解释了当'00001' == '1'返回TRUE正在进行的

问题是: 为什么 PHP会这样做?
探测字符串是数字的原因是什么,然后如果是这样的话?为什么我们不能只比较两个字符串呢?

如果两个操作数具有不同的类型,我可以完全理解需要什么样的转换。但是,当它们都是字符串时,为什么它会“usual math”?

3 个答案:

答案 0 :(得分:4)

您可以比较两个字符串。

"00001" === "1"  // false

请记住==表示等效===表示相等

我唯一的猜测是,为什么会出现这种情况,因为在开始PHP成为松散类型的语言之前,它一直努力成为一种无类型的语言。

PHP最初是字符串处理器,允许在其中进行一些脚本编写。由于网络上的所有输入本质上都是文本性的,因此在处理数字时,文本输入必须努力工作才能表现得很好。

我可能错了,但我不相信显式转换数据类型的能力进入舞台,直到PHP 4引入了* val函数(如intval)等等,我认为是铸造符号,如(int)之后出现了。

对于非比较操作,它非常简单,因为它们都有一个与它们相关联的类型(+ - / *都处理数字,而。处理字符串)所以在这些情况下应该如何投射事物的明确路径是明显。

但是通过变量之间的相等或等价检查,那么唯一的方法就是将看起来像数字的所有东西都当作数字处理,因为当时唯一可以获得的方法是外部将是一个字符串除此之外别无他法。

答案 1 :(得分:3)

因为,PHP为最终用户生成产品,而不是为应用程序开发人员生成产品。 所以当你生产如下产品时:

if (isset($_POST['submit'])){
  if ($_POST['myinput'] == "1") echo 'Yes'; //or == 1
  else echo 'NO';
}

    ?>
    <form name="myform" method="POST" action="">
    <input name="myinput">
    <input name="submit" type="submit">
    </form>

如果用户输入10001,您希望在这两种情况下打印什么? YesNO

答案很清楚。我们希望看到Yes。所以这是why PHP does so 如果由于任何罕见的原因,我们需要明确地比较它们,那么我们应该将==更改为===

答案 2 :(得分:3)

啊,最后我明白了。这对我来说太愚蠢了。

比较不仅涉及"is equal",还涉及"less than""greater than"。对于后两者,在比较之前转换数值操作数显然是至关重要的,因为数字通常在PHP中表示为字符串,而11必须大于9,即使两者都存储在字符串中。

因此,当compare_function()同时进行所有比较时,返回1, 0, -1以判断第一个操作数是分别大于,等于还是小于秒 - 嗯,它是相当解释,为什么要操作操作数。