Php 逻辑运算符,| |或?

Php 逻辑运算符,| |或?,php,operators,logical-operators,or-operator,Php,Operators,Logical Operators,Or Operator,我记得不久前读到过关于逻辑运算符的文章,在或的情况下,使用|优于或(反之亦然) 当它回到我的项目中时,我不得不在我的项目中使用它,但我不记得推荐了哪个操作员,或者它是否是真的 哪个更好?为什么?我不认为一种语言天生比另一种更好,但我建议坚持使用| |,因为这是大多数语言的默认设置 编辑:正如其他人所指出的,两者之间确实有区别。没有“更好”,但更常见的是|。它们具有不同的功能,|将正常工作 另请参见:(以下示例取自此处): 它们用于不同的目的,事实上有不同的运营商先例。&&和|运算符用于布尔条件,

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

当它回到我的项目中时,我不得不在我的项目中使用它,但我不记得推荐了哪个操作员,或者它是否是真的


哪个更好?为什么?

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

编辑:正如其他人所指出的,两者之间确实有区别。

没有“更好”,但更常见的是
|
。它们具有不同的功能,
|
将正常工作

另请参见:(以下示例取自此处):


它们用于不同的目的,事实上有不同的运营商先例。
&&
|
运算符用于布尔条件,而
运算符用于控制流

例如,以下是布尔条件:

if ($foo == $bar && $baz != $quxx) {
这与控制流不同:

doSomething() or die();

没有什么不好或更好的,它只是取决于运算符的优先级。由于
|
的优先级高于
,因此主要使用
|

来源:

下面是使用逻辑运算符的示例代码:

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

合乎逻辑

一些语言使用短路,而另一些语言使用完全布尔求值(如果您知道,这类似于Pascal中的指令
$B

说明:

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

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

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

但是,对于
(A()| B())
,无论第一个部分的值是多少,第二个部分始终进行计算


对于优化编程,应始终使用速度更快的
(第一部分返回
false
的情况除外,第二部分实际需要评估)。

分别使用| |和或&&and和之间的差异为:

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

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

$bool=TRUE&&FALSE
  • 解释为
    ($bool=(真与假))
  • $bool
    的值为
    FALSE

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

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

      假设代码如下所示:

      $positions = $this->positions() || [];
      
      当$this->positions()返回false或null时,$positions是空数组,这是您在javascript中经常看到的。但事实并非如此。该值为TRUE或FALSE取决于$this->positions()返回的内容

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

      $positions = $this->positions() 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";
      
      因此,当您想要设置返回值或空数组时,实际上第三个选项
      ?:
      是正确的解决方案

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

      使用PHP7.2.1测试
      die()
      如果
      doSomething()
      返回
      false
      null
      ,将调用函数?如果
      doSomething()
      返回
      true
      或什么都不返回怎么办?
      doSomething()
      作为布尔值计算。如果它返回一个值(
      true
      ,一个非空字符串,等等),它将不会调用
      die()
      $e=true | |$x='foo'
      将不会定义
      $x
      ,因为短路,而不是因为优先级更高。还值得注意的是,它们总是返回一个布尔值,与许多其他语言不同,它们返回最后检查的值。所以在PHP中(27 | | 0)返回true,而不是27。@TextGeek,“这些”
      27或0
      为我返回
      27
      。@Jānis Elmeris--你是对的,我应该只提到“| |”的情况。@TextGeek,事实上,
      也返回布尔值,你是对的。只是它的优先级太低,有时看起来像做了其他事情
      print27或0
      将打印
      27
      ,因为
      发生在
      print27
      之后。顺便说一句,
      echo
      不会被愚弄–
      echo 27或0
      会输出
      1
      。这不是“最佳答案!!”。请向上滚动并获取投票最多的答案,以获得良好的解释。使用
      |
      ,将不会调用
      B
      。这两个操作符的作用完全相同,只是优先级不同。“你应该总是使用或哪个更快”嗯,我想知道这是不是真的。。。让我们检查一下:操作码的数量是相同的。因此,从性能角度来看,这并不重要。答案是错误的,第二个示例与第一个示例完全相同one@WayFarer嗯,这是不正确的(有一个问题),但您也错了(| |和或不一样)-请参见我的editright,运算符| | |和“或”具有不同的优先级,因此,您的第二个示例的工作方式是:($second=returnEmpty()或[]);所以,原始问题的答案是| |更好,始终使用它,直到您真正理解为什么要使用“或”
      $positions=$this->positions()??[];
      bool(false)
      NULL
      array(0) {
      }
      
      $positions = $this->positions() ?: [];