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

You*_*nse 12 php comparison casting string-comparison

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

如果...比较涉及数字字符串,则每个字符串将转换为数字,并且数字执行比较.

好的,我明白了.它解释'00001' == '1'返回时发生了什么TRUE.

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

如果两个操作数具有不同的类型,我可以完全理解需要什么样的转换.但是,当它们都是字符串时,它为什么会做" 通常的数学 "

Ora*_*ill 5

您可以比较两个字符串。

"00001" === "1"  // false
Run Code Online (Sandbox Code Playgroud)

记住==意味着等价 ===意味着相等

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

PHP 最初是字符串处理器,允许在其中编写一些脚本。由于网络上的所有输入本质上都是文本输入,因此在处理数字时必须努力工作以确保文本输入正常运行。

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

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

但是对于变量之间的相等或等价检查,那么唯一的方法就是将所有看起来像数字的东西都当作数字来对待,因为当时唯一可以通过外部获取它的方法是作为一个字符串,并且有否则没有办法做到。

  • @Orangepill - 但他的问题是“为什么?” (2认同)

You*_*nse 3

啊,终于我明白了。我真是太愚蠢了。

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

因此,就像一次所有比较compare_function()一样,返回分别判断第一个操作数是否大于、等于或小于第二个操作数 - 好吧,这很好地解释了为什么操作数被转换。1, 0, -1