为什么PHP在[松散]比较两个数值字符串之前将它们强制转换为数字


Why PHP casts two numerical strings to numbers before [loosely] comparing them?

我浏览了几个类似的问题,但它们都只陈述了事实:

如果……比较涉及数字字符串,然后将每个字符串转换为数字,并以数字方式执行比较。

好的,我知道了。它解释了当'00001' == '1'返回TRUE发生了什么。

问题是:为什么 PHP这样做?
探查字符串是否为数字,然后对其进行强制转换的原因是什么?为什么不能直接比较两个字符串呢?

如果两个操作数具有不同的类型,我可以相当理解需要进行什么类型转换。但是,当两者都是字符串时,为什么它是"通常的数学"?

可以比较两个字符串。

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

记住==表示等价===表示等价

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

PHP最初是一个字符串处理器,允许在里面编写一些脚本。由于网络上的所有输入本质上都是文本的,所以当涉及到处理数字时,它必须努力在文本输入的情况下表现得理智。

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

对于非比较操作,这很简单,因为它们都有一个相关联的类型(+ -/*都处理数字,而。处理字符串),因此在这些情况下,应该如何转换的清晰路径是显而易见的。

但是对于变量之间的相等性或等价性检查,那么唯一的方法就是将所有看起来像数字的东西都视为数字,因为当时唯一可以从外部获得它的方法是将其作为字符串,并且没有其他方法。

因为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,您希望在这两种情况下打印什么?Yes还是NO ?

答案很清楚。我们期待看到Yes。这是why PHP does so如果出于某种罕见的原因,我们确实需要比较它们,那么我们应该将==更改为===

啊,我终于明白了。我真笨。

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

因此,由于compare_function()一次执行所有比较,返回1, 0, -1分别告诉第一个操作数是大于,等于还是小于第二个-好吧,它很好地解释了为什么要强制转换操作数。