【问题标题】:PHP if OR is the second part checked on true?PHP 如果 OR 是第二部分检查为真?
【发布时间】:2011-10-10 23:10:36
【问题描述】:

我知道这一定是一个简单的问题,但我知道在 PHP 中这样的语句

if ($a && $b) { do something }

如果 $a 为假 PHP 甚至不检查 $b

那么,OR 也一样

if ($a || $b) { do something }

如果 $a 为真,它是否仍然检查 $b

我知道这是基本的东西,但我在任何地方都找不到答案...谢谢

【问题讨论】:

    标签: php optimization conditional-statements short-circuiting


    【解决方案1】:

    如果您非常了解您的真值表,那么您可能可以自己弄清楚。正如其他人所说,PHP 将评估直到确定结果为止。在 OR 的情况下,只有一个为真,语句才能返回真。所以 PHP 会一直计算,直到找到一个真值。如果找不到,则该语句评估为 false。

    <?php
    if(true && willGetCalled()) {}
    if(false && wontGetCalled()) {}
    if(true || wontGetCalled()) {}
    if(false || willGetCalled()) {}
    ?>
    

    【讨论】:

      【解决方案2】:

      如果至少一个 OR 操作数为真,则无需进一步检查其他操作数,整个事情将评估为真。

      (a || b || c || d || e ||...) 如果至少有一个操作数为真,则为真,因此一旦我发现一个操作数为真,我就不需要检查以下操作数。

      这个逻辑适用于任何地方,PHP、JAVA、C...

      【讨论】:

      • 问题不在于逻辑,而在于 PHP 实现
      【解决方案3】:

      看这个例子:

      function foo1() {
        echo "blub1\n";
        return true;
      }
      
      function foo2() {
        echo "blub2\n";
        return false;
      }
      
      if (foo1() || foo2()) {
        echo "end.";
      }
      

      $b / foo2() 未检查。 在这里演示:codepad.org

      【讨论】:

        【解决方案4】:

        请参阅手册中Logical Operators 页面上的示例 1。

        // --------------------
        // foo() will never get called as those operators are short-circuit
        
        $a = (false && foo());
        $b = (true  || foo());
        $c = (false and foo());
        $d = (true  or  foo());
        

        【讨论】:

          【解决方案5】:

          一旦知道结果,逻辑表达式的计算就会停止。

          logical operators

          【讨论】:

          • 这是用户评论,不是权威性声明——但实际上它是正确的。
          • 找不到您使用 CTRL+F 找到的“评估”评论;)
          • 我的意思是您在答案中找到的评论。我找到了我引用的那个。抱歉不清楚。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-11
          • 2015-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多