【问题标题】:Understanding PHP type coercion了解 PHP 类型强制
【发布时间】:2014-12-31 17:03:56
【问题描述】:

我看到了这么一小段代码,让我无法理解:

<?php

$a = '0e462097431906509019562988736854';
$b = '0e830400451993494058024219903391';

var_dump($a == $b);

将输出:

bool(true)

我了解当使用== 时,PHP 会尝试模糊比较,在类型之间进行静默转换以执行比较。我理解的是为什么 PHP 似乎认为这两个字符串是相同的。由于$a$b 是字符串,我会认为不需要进行类型转换。

我不明白什么?

【问题讨论】:

    标签: php type-conversion dynamic-typing


    【解决方案1】:

    我认为这篇文章解释得很好:

    Type-coercing comparison operators will convert numeric strings to numbers

    在这里引用主要问题:

    根据php language.operators.comparison,如果两个操作数看起来都像数字,则类型强制比较运算符会将它们强制为浮点数,即使它们都已经是字符串:

    其中两个 字符串 都使用指数符号,因此被视为数字字符串,进行松散比较 (==),将这些 字符串 强制转换为 floats 在真正“松散地”比较它们之前。

    作为最佳实践并防止意外行为,请始终尝试使用identity equality (===),尤其是在处理字符串时

    【讨论】:

      【解决方案2】:

      PHP 尝试转换为 float 类型,因为字符串以 0 开头。它在 0 之后停止,因为下一个字符不是数字。当您使用类型强制将科学记数法转换为整数时,也会发生同样的事情:

      $x = (float)"12E-1x";  // $x == 1.2
      $x = (int)"12E-1x";  // $x == 12 (stops at E because it's not an integer)
      

      【讨论】:

        【解决方案3】:

        这不是一个真正的答案,但如果你尝试

        $a = '0e4620974319065090195629887368549';
        $b = '0e8304004519934940580242199033918';
        echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b);
        

        你得到:

        0
        
        0
        
        bool(true)
        

        现在,如果你尝试:

        $a = '0e4620974319065090195629887368549';
        $b = '1e8304004519934940580242199033918';
        echo floatval($a) . '<br>' . floatval($b);var_dump($a == $b);
        

        你得到:

        0
        
        INF
        
        bool(false)
        

        我的猜测是 PHP 将字符串转换为浮点数并使用获得的浮点数给出比较结果,无论如何这都不正确,但那是另一回事了。

        【讨论】:

        • 但是,当两者都是字符串时,为什么?
        【解决方案4】:

        在官方文档中,两个变量是否相等的测试如下:

        $a == $b # Equal TRUE if $a is equal to $b after type juggling.
        

        示例

        $a = 13;   # Integer type
        $b = "13"; # String type
        var_dump($a == $b); # Will say TRUE, because juggling was made
        var_dump($a === $b); # Will say FALSE, because PHP will also evaluate the type of variables :)
        

        【讨论】:

          猜你喜欢
          • 2019-07-10
          • 2011-01-25
          • 1970-01-01
          • 2011-12-12
          • 1970-01-01
          • 1970-01-01
          • 2020-11-14
          • 1970-01-01
          • 2017-07-02
          相关资源
          最近更新 更多