12

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

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

好的,我明白了。它解释'00001' == '1'返回时发生的情况TRUE

问题是:为什么PHP 会这样做?
探测字符串是否为数字的原因是什么,如果是,则进行强制转换?为什么我们不能只比较两个字符串呢?

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

4

3 回答 3

5

您可以比较两个字符串。

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

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

关于为什么会这样,我唯一的猜测是因为一开始 PHP 努力成为一种无类型语言,然后才走上成为松散类型语言的道路。

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

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

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

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

于 2013-06-02T05:13:25.317 回答
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>

如果用户输入1or 0001,你希望在这两种情况下打印什么?Yes还是NO

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

于 2013-06-02T06:16:33.200 回答
3

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

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

因此,就像所有比较一次compare_function()一样,返回要么分别判断第一个操作数是否更大、等于或小于第二个——嗯,它公平地解释了为什么要强制转换操作数。1, 0, -1

于 2013-06-02T06:22:11.117 回答