You*_*nse 12 php comparison casting string-comparison
我浏览了几个类似的问题,但他们都只说明了这样一个事实:
好的,我明白了.它解释了'00001' == '1'
返回时发生了什么TRUE
.
问题是:为什么 PHP会这样做?
探测字符串是数字的原因是什么,然后如果是这样的话?为什么我们不能只比较两个字符串?
如果两个操作数具有不同的类型,我可以完全理解需要什么样的转换.但是,当它们都是字符串时,它为什么会做" 通常的数学 "
您可以比较两个字符串。
"00001" === "1" // false
Run Code Online (Sandbox Code Playgroud)
记住==
意味着等价 ===
意味着相等
对于为什么会出现这种情况,我唯一的猜测是因为 PHP 在开始成为一种松散类型语言之前努力成为一种无类型语言。
PHP 最初是字符串处理器,允许在其中编写一些脚本。由于网络上的所有输入本质上都是文本输入,因此在处理数字时必须努力工作以确保文本输入正常运行。
我可能是错的,但我不相信显式转换数据类型的能力在 PHP 4 引入 *val 函数(如 intval)等之前进入阶段,我认为转换符号,就像(int)
在之后出现那。
对于非比较操作,这很容易,因为它们都有一个与之关联的类型(+ - /* 都处理数字,而 . 处理字符串),因此在这些情况下应该如何转换事物的清晰路径是显而易见的。
但是对于变量之间的相等或等价检查,那么唯一的方法就是将所有看起来像数字的东西都当作数字来对待,因为当时唯一可以通过外部获取它的方法是作为一个字符串,并且有否则没有办法做到。
啊,终于我明白了。我真是太愚蠢了。
比较不仅涉及到"is equal"
而且还"less than"
涉及到"greater than"
。对于后两者,在比较之前转换数字操作数显然很重要,因为数字通常在 PHP 中表示为字符串,而 11 必须大于 9,即使两者都存储在字符串中。
因此,就像一次所有比较compare_function()
一样,返回分别判断第一个操作数是否大于、等于或小于第二个操作数 - 好吧,这很好地解释了为什么操作数被转换。1, 0, -1