【问题标题】:Logical Operators, || or OR?逻辑运算符,||或?
【发布时间】:2011-08-25 07:03:04
【问题描述】:

我记得不久前读过关于逻辑运算符的文章,在 OR 的情况下,使用 || 比使用 or 更好(反之亦然)。

当它返回给我时,我只需要在我的项目中使用它,但我不记得推荐了哪个运算符,甚至不记得它是否正确。

哪个更好,为什么?

【问题讨论】:

    标签: php operators logical-operators or-operator


    【解决方案1】:

    一些语言使用短路,而其他语言使用完整的布尔评估(如果你知道的话,这类似于 Pascal 中的指令 $B)。

    解释:

    function A(){
        ...Do something..
        return true;
    }
    
    function B(){
        ...Do something..
        return true;
    }
    
    if ( A() OR B() ) { .....
    

    在这个例子中,函数B() 永远不会被执行。由于函数 A() 返回 TRUE,因此 OR 语句的结果从第一部分就可以知道,而无需计算表达式的第二部分。

    但是对于( A() || B() ),无论第一部分的值如何,都会始终评估第二部分。

    为了优化编程,您应该始终使用更快的OR(除了第一部分返回false而第二部分实际需要评估的情况)。

    【讨论】:

    • 这不是“最佳答案!!”。请向上滚动并选择投票最多的答案以获得良好的解释。使用||B 将不会被调用。两个运算符的作用完全相同,只是优先级不同。
    • "你应该总是使用更快的 OR" 嗯,我想知道这是不是真的......所以让我们检查一下:3v4l.org/5QSAA/vld#tabs3v4l.org/PdjJP/vld#tabs 操作码的数量是相同的。所以性能方面并不重要。
    【解决方案2】:

    来源:http://wallstreetdeveloper.com/php-logical-operators/

    这里是使用逻辑运算符的示例代码:

    <html>
    
    <head>
        <title>Logical</title>
    </head>
    
    <body>
        <?php
            $a = 10;
            $b = 20;
            if ($a>$b)
            {
                echo " A is Greater";
            }
            elseif ($a<$b)
            {
                echo " A is lesser";
            }
            else
            {
                 echo "A and B are equal";
            }
        ?>
        <?php
            $c = 30;
            $d = 40;
            //if (($a<$c) AND ($b<$d))
            if (($a<$c) && ($b<$d))
            {
                echo "A and B are larger";
            }
            if (isset($d))
                $d = 100;
            echo $d;
            unset($d);
        ?>
        <?php
            $var1 = 2;
            switch($var1)
            {
                case 1:  echo "var1 is 1";
                         break;
                case 2:  echo "var1 is 2";
                         break;
                case 3:  echo "var1 is 3";
                         break;
                default: echo "var1 is unknown";
            }
        ?>
    </body>
    </html>
    

    【讨论】:

    • 链接已损坏。
    【解决方案3】:

    我知道这是一个老话题,但仍然如此。我刚刚在工作中调试的代码中遇到了问题,也许有人可能有类似的问题...

    假设代码如下所示:

    $positions = $this->positions() || [];
    

    你会期望(就像你从 JavaScript 中习惯的那样)当 $this->positions() 返回 false 或 null 时,$positions 是空数组。但事实并非如此。该值是 TRUE 还是 FALSE 取决于 $this->positions() 返回的内容。

    如果你需要获取 $this->positions() 的值或者空数组,你必须使用:

    $positions = $this->positions() or [];
    

    编辑:

    上面的例子没有按预期工作,但事实是 ||or 不一样...试试这个:

    <?php
    
    function returnEmpty()
    {
      //return "string";
      //return [1];
      return null;
    }
    
    $first = returnEmpty() || [];
    $second = returnEmpty() or [];
    $third = returnEmpty() ?: [];
    
    var_dump($first);
    var_dump($second);
    var_dump($third);
    echo "\n";
    

    这是结果:

    bool(false)
    NULL
    array(0) {
    }
    

    所以,当你想设置返回值或空数组时,实际上第三个选项?: 是正确的解决方案。

    $positions = $this->positions() ?: [];
    

    使用 PHP 7.2.1 测试

    【讨论】:

    • 答案不正确,第二个例子和第一个完全一样
    • @WayFarer 好吧,这不正确(存在问题)但您也错了(|| 和 OR 不一样)-请参阅我的编辑
    • 对,运算符 ||和 'or' 有不同的优先级,所以,你的第二个例子是: (($second = returnEmpty()) 或 []);所以,原始问题的答案是||更好,一直使用它,直到你真正理解为什么要使用'or'
    • $positions = $this-&gt;positions() ?? []; 可能是您想要的。
    【解决方案4】:

    分别||的区别和 OR 和 && 和 AND 是 operator precedence

    $bool = FALSE || TRUE;

    • 解释为($bool = (FALSE || TRUE))
    • $bool 的值为TRUE

    $bool = FALSE OR TRUE;

    • 解释为(($bool = FALSE) OR TRUE)
    • $bool 的值为FALSE

    $bool = TRUE &amp;&amp; FALSE;

    • 解释为($bool = (TRUE &amp;&amp; FALSE))
    • $bool 的值为FALSE

    $bool = TRUE AND FALSE;

    • 解释为(($bool = TRUE) AND FALSE)
    • $bool 的值为TRUE

    【讨论】:

      【解决方案5】:

      没有好坏之分,这取决于运算符的优先级。由于|| 的优先级高于or,所以|| 的使用较多。

      【讨论】:

        【解决方案6】:

        我不认为一个天生就比另一个更好,但我建议坚持使用 ||因为它是大多数语言的默认设置。

        编辑:正如其他人指出的那样,两者之间确实存在差异。

        【讨论】:

          【解决方案7】:

          没有“更好”,但更常见的是||。他们有不同的precedence|| 会像人们预期的那样正常工作。

          另见:Logical operators以下示例取自那里):

          // The result of the expression (false || true) is assigned to $e
          // Acts like: ($e = (false || true))
          $e = false || true;
          
          // The constant false is assigned to $f and then true is ignored
          // Acts like: (($f = false) or true)
          $f = false or true;
          

          【讨论】:

          • $e = true || $x = 'foo' 不会定义 $x 因为短路,而不是因为更高的优先级。
          • 值得注意的是,这些总是返回一个布尔值,不像许多其他语言返回最后检查的值。所以在 PHP (27 || 0) 中返回 true,而不是 27
          • @TextGeek,“这些”? 27 or 0 为我返回 27
          • @Jānis Elmeris -- 你是对的,我应该只提到“||”案例。
          • @TextGeek,实际上,or 也返回布尔值是对的。只是它的优先级太低,以至于有时看起来就像它在做其他事情。 :) print 27 or 0 将打印 27 因为or 发生在之后 print 27。顺便说一句,echo 不会被愚弄——echo 27 or 0 会输出1
          【解决方案8】:

          它们用于不同的目的,实际上具有不同的运算符优先级。 &amp;&amp;|| 运算符用于布尔条件,而 andor 用于控制流。

          例如,以下是一个布尔条件:

          if ($foo == $bar && $baz != $quxx) {
          

          这与控制流不同:

          doSomething() or die();
          

          【讨论】:

          • die() 如果doSomething() 将返回falsenull,将调用函数?如果doSomething() 返回true 或什么都不返回怎么办?
          • doSomething() 被评估为布尔值。如果它返回一个 PHP 认为是真的值(true、非空字符串等),它不会调用die()
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多