我浏览了几个类似的问题,但它们都只陈述了一个事实:
好的,我明白了。它解释了'00001' == '1'
返回时发生的情况TRUE
。
问题是:为什么PHP 会这样做?
探测字符串是否为数字的原因是什么,如果是,则进行强制转换?为什么我们不能只比较两个字符串呢?
如果两个操作数具有不同的类型,我可以相当理解需要什么转换。但是,当两者都是字符串时,为什么它会进行“通常的数学运算”呢?
我浏览了几个类似的问题,但它们都只陈述了一个事实:
好的,我明白了。它解释了'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>
如果用户输入1
or 0001
,你希望在这两种情况下打印什么?Yes
还是NO
?
答案很明确。我们期待看到Yes
。所以这是why PHP does so
如果出于某种罕见的原因,我们确实需要比较它们,那么我们应该==
改为===
啊,我终于明白了。我真是太愚蠢了。
比较不仅涉及"is equal"
,还涉及"less than"
和"greater than"
。对于后两者,在比较之前转换数字操作数显然很重要,因为数字在 PHP 中通常表示为字符串,并且 11 必须大于 9,即使两者都存储在字符串中。
因此,就像所有比较一次compare_function()
一样,返回要么分别判断第一个操作数是否更大、等于或小于第二个——嗯,它公平地解释了为什么要强制转换操作数。1, 0, -1