【问题标题】:Double equals and tripple equals in phpphp中的双等号和三等号
【发布时间】:2011-12-17 19:49:18
【问题描述】:

我在 StackOverflow 和 Google 上搜索过,但找不到这个问题的答案:

我们是否应该总是在 PHP 中使用三等号进行验证?

例如,我有一个变量:

$x = '1';

if($x == 1)  // will work
if($x === 1) // will not

现在,我的意思是我们是否需要验证数字字段,例如:

if(is_numeric($x) && $x == '1') { 将等同于 if($x === 1)

既然===也验证类型,那我们总是使用===会不会更好?

【问题讨论】:

    标签: php


    【解决方案1】:

    来自http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/

    == 没用。

    ‣ 它不是传递的。 "foo" == TRUE, and "foo" == 0... 但是,当然, 真!= 0。

    ‣ == 尽可能转换为数字,这意味着它会尽可能转换为浮点数。如此大的十六进制字符串(例如密码 哈希)有时可能会比较真实,但实际上它们不是。甚至 JavaScript 不这样做。

    ‣ 同理,“6”==“6”,“4.2”==“4.20”,“133”== “0133”。但请注意 133 != 0133,因为 0133 是八进制。

    ‣ === 比较值和类型……除了对象,其中 === 仅当两个操作数实际上是同一个对象时才为真!对于对象, == 比较(每个属性的)值和类型,其中 是 === 对所有其他类型所做的。什么。

    http://habnab.it/php-table.html

    还有http://phpsadness.com/sad/47

    还有http://developers.slashdot.org/comments.pl?sid=204433&cid=16703529

    话虽如此,当您在创建简单表达式时绝对确定类型不是问题时,根据我的经验, == 工作得很好。请保持警惕。

    【讨论】:

      【解决方案2】:

      这完全取决于您正在编写的脚本,对此没有一个正确的答案。话虽如此,在很多情况下您还不知道变量的类型(也许用户输入除外)。

      这就是我坚持使用== 并且仅在可能存在不止一种类型的变量时才使用=== 的原因。

      == 在大多数情况下都很好,如果你不应该使用它就不会被发明出来:)

      【讨论】:

      • “这完全取决于你正在编写的脚本,”+1
      • 请注意"1e3" == "1000""61529519452809720693702583126814" == "61529519452809720000000000000000" 都是true,因此您不应该使用== 来比较字符串。
      • “如果你不应该使用它,它就不会被发明出来”——抱歉,不要买那个。 :) 特别是考虑到 php 最初是如何演变的。
      • @ausi,刚刚尝试了第二次字符串比较,它对我的​​评估结果为 false。我在我的机器上使用 5.5.21。为什么那些评估是相同的
      • @Swaraj 第二个比较已在 PHP 5.4.4 Bug #54547 中修复。为什么他们在 5.4.4 之前确实评估为 true,如下所述:phpsadness.com/sad/47
      【解决方案3】:

      这取决于你想做什么。
      鉴于从表单中数据以字符串形式出现,== 很方便,因为它可以比较表示数字的字符串和数字,而无需额外的类型转换。

      if ($_GET['amount'] == 10) {
          //...
      }
      

      所以不,最好总是使用===

      【讨论】:

        【解决方案4】:
        if (is_numeric($x) && $x == '1') { ...
        

        这在我看来是多余的。为什么我们需要检查$x is_numeric'1' 的值?我们知道'1' 是数字所以如果它等于'1' 那么它一定是一个数字。


        你可以用===比较:

        如果您可以将其解释为字符串:

        if ($x === '1') { ...
        

        如果您必须将该值解释为int

        if ((int) $x === 1) { ...
        

        如果你不关心实际类型:

        if ($x == '1') { ...
        

        【讨论】:

          【解决方案5】:

          我会说最好始终使用 === 并删除一个 = 以防万一。

          是的,它是相等的,虽然很奇怪。更好的写法是if(is_numeric($x) && $x == 1)

          【讨论】:

            【解决方案6】:

            如果你期望你传递的变量将(并且必须)是整数,那么你应该使用三等号,如果不是那么你应该避免这种情况。

            不过,如果您真的想使用 ===,那么您应该在此过程中将变量转换为您想要的类型,就像在这个例子中一样:

            if ((int) $var === 1)
            {
            
                // will return true if the $var is 1
            }
            

            【讨论】:

              【解决方案7】:

              如果你想要这么强的验证,那么答案是:是的,一定要用===

              == 也做了一些非常奇怪的事情,比如比较完全不同的字符串是否相等,只是因为它们在数值上是相等的。所以=== 在大多数情况下可能对你来说是一个更好的工具。

              【讨论】:

                猜你喜欢
                • 2011-12-24
                • 1970-01-01
                • 1970-01-01
                • 2012-10-06
                • 2012-12-06
                • 2020-06-16
                • 1970-01-01
                • 2012-08-05
                相关资源
                最近更新 更多