逻辑运算符,|| 或


104

我记得有一阵子关于逻辑运算符的内容,在的情况下OR,使用||要好于or(反之亦然)。

当我回到项目中时,我只需要在项目中使用它,但是我不记得建议使用哪个运算符,或者它是否正确。

哪个更好?为什么?

Answers:


139

没有“更好的”,但是更常见的是||。它们具有不同的优先级,并且||可以像通常期望的那样工作。

另请参阅:逻辑运算符以下示例从此处获取):

// 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;

11
并且$e = true || $x = 'foo'不会$x因为短路而不是较高的优先级来进行定义。
马特·基兰

1
还值得注意的是,它们总是返回布尔值,这与许多其他语言不同,它们返回最后检查的值。因此,在PHP(27 || 0)中返回true,而不是27
TextGeek

@TextGeek,“这些”?给我27 or 0回来27
贾尼斯·埃默里斯(JānisElmeris)'18年

@JānisElmeris-您是正确的,我应该只提及“ ||” 案件。
TextGeek

2
@TextGeek,实际上,您也正确or返回了布尔值。只是它的优先级如此之低,以至于有时看起来好像在做其他事情。:) print 27 or 0将打印,27因为or发生在之后 print 27。顺便说一句,echo不上当- echo 27 or 0将输出1
雅尼斯·埃默里斯(JānisElmeris)'18年

43

它们用于不同的目的,实际上具有不同的运算符优先级。的&&||运营商意图用于布尔条件,而andor旨在用于控制流程。

例如,以下是布尔条件:

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

这与控制流程不同:

doSomething() or die();

die()如果doSomething()返回false或将调用该函数null?如果doSomething()返回true还是什么都没有怎么办?
giannis christofakis

5
doSomething()被评估为布尔值。如果返回PHP认为真实的值(例如true,非空字符串等),则不会调用die()
马修·拉兹洛夫

23

||之间的区别 并且OR和&&&和AND是运算符优先级

$bool = FALSE || TRUE;

  • 解释为 ($bool = (FALSE || TRUE))
  • 价值$bool就是TRUE

$bool = FALSE OR TRUE;

  • 解释为 (($bool = FALSE) OR TRUE)
  • 价值$bool就是FALSE

$bool = TRUE && FALSE;

  • 解释为 ($bool = (TRUE && FALSE))
  • 价值$bool就是FALSE

$bool = TRUE AND FALSE;

  • 解释为 (($bool = TRUE) AND FALSE)
  • 价值$bool就是TRUE

5

来源: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>

链接断开。
彼得·莫滕森

2

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

假设代码看起来像这样:

$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

@WayFarer好,这是不正确(有问题),但是你错了太(||和OR是不一样的) -见我的编辑
兹德涅克

对,运营商|| 和'或'具有不同的优先级,因此,第二个示例的工作方式是:(($ second = returnEmpty())或[]); 因此,原始问题的答案将是||。更好,请始终使用它,直到您真正理解为什么要使用“或”
为止

1
$positions = $this->positions() ?? [];可能是您想要的。
主教

0

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

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


0

没有什么不好或更好的了,这仅取决于运算符的优先级。由于||具有比更高的优先级or,因此||被广泛使用。


-3

有些语言使用短路,而另一些语言则使用完整的布尔值评估(如果您知道,这类似于$BPascal中的指令)。

说明:

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将不会被调用。除了优先级不同之外,两个运算符的功能完全相同。
bzeaman 2014年

“您应该始终使用速度更快的OR”嗯,我想知道这是否正确...所以让我们检查一下:3v4l.org/5QSAA/vld#tabs 3v4l.org/PdjJP/vld#tabs操作码的数量是相同。因此,性能明智无关紧要。
詹斯·科赫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.