【问题标题】:Is there a compelling reason to use PHP's operator === in comparison operations, over ==?在比较操作中使用 PHP 的运算符 === 是否有令人信服的理由,而不是 ==?
【发布时间】:2015-06-20 10:35:07
【问题描述】:

假设我有这个代码:

$str = '5';
$int = 5;

为了比较,有什么理由使用这样的东西(带转换):

if ($int === intval($str)) //...

还是我只使用原生 PHP 工具?

if ($int == $str) //...

对我来说,== 看起来更简单,也许是以 PHP 为我做额外工作为代价的。

【问题讨论】:

  • 如果你不关心数据类型,没有理由使用===。如果您确实关心数据类型,您将需要使用 ===。所以,我只在数据类型很重要时才保留 ===。然后,如果我在我的代码中看到 ===,我知道它的存在是有充分理由的。

标签: php operators equals-operator


【解决方案1】:

使用 '==' 往往会导致细微的错误 - 例如,如果两个字符串看起来像数字,PHP 不会将它们作为字符串进行比较,这可能会产生意想不到的结果 - 最常见/可怕的例子是:

<?php

$actual_password = '240610708';
$provided_password = 'QNKCDZO';

// These would presumably be stored in your database
$stored_password_md5 = md5($actual_password); //0e462097431906509019562988736854;
$stored_password_hash = password_hash($actual_password, PASSWORD_DEFAULT);

$computed_password_md5 = md5($provided_password); //0e830400451993494058024219903391

var_dump($stored_password_md5 == $computed_password_md5); // bool(true) - BAD! NO!
var_dump($stored_password_md5 === $computed_password_md5); // bool(false) - Better, but still no. Vulnerable to timing attacks
var_dump(hash_equals($stored_password_md5, $computed_password_md5)); // bool(false) getting somewhere
var_dump(password_verify($provided_password, $stored_password_hash)); // bool(false) best

虽然在您的具体示例中,没有发生此问题,但可能的问题导致很多人建议 /always/ 使用 ===,因此您不必记住 == 何时安全以及何时不是。

【讨论】:

    【解决方案2】:

    取决于你想要做什么。某些函数可能会返回 false0 或正整数,例如 strpos()0 表示在位置 0 找到了字符串,因此 == false 不会像 === false 那样工作。

    在您的场景中,可以使用 ==,因为这在从 DB 或 $_POST$_GET 获取值时很常见,它们将始终是字符串。

    感谢 Fred Emmott 的评论:小心,以下返回 true

    var_dump('0xa' == '10');   // 0xa hex 10 in decimal
    var_dump('10pigs' == 10);  // pigs truncated
    

    String conversion to numbers

    【讨论】:

    • 澄清一下:== 对于任意字符串是不安全的 - 例如: $x = '0e462097431906509019562988736854'; $y = '0e830400451993494058024219903391'; var_dump($x == $y); // true 更详细的示例在下面的单独答案中3v4l.org/a6DZC
    • @FredEmmott 谢谢。已编辑。
    【解决方案3】:

    == 运算符只是检查左右值是否相等。但是,=== 运算符(注意额外的“=”)实际上检查左右值是否相等,并检查它们是否属于相同的变量类型(比如它们是否都是布尔值、整数, 等等。)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 2011-01-06
      • 2011-01-16
      • 2012-04-19
      • 1970-01-01
      • 2012-05-12
      • 2017-07-21
      • 2011-04-01
      相关资源
      最近更新 更多