Logical Operators, || or OR?

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

I just had to use this in my project when it came back to me, but I can't remember which operator was recommended or if it was even true.

Which is better and why?

166105 次浏览

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

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

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

另见: 逻辑运算符 (下面的例子就是从这里开始的) :

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

They are used for different purposes and in fact have different operator precedences. The && and || operators are intended for Boolean conditions, whereas and and or are intended for control flow.

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

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

这与控制流不同:

doSomething() or die();

没有什么好坏之分,它只是取决于运算符的优先级。由于 ||的优先级高于 or,所以大多数情况下使用 ||

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

有些语言使用短路,有些语言使用完全布尔计算(如果您知道,这类似于 Pascal 中的指令 $B)。

Explanations:

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


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


if ( A() OR B() ) { .....

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

但是,对于 ( A() || B() ),无论第一个部分的值如何,总是计算第二个部分。

对于优化的编程,您应该始终使用 OR,这是更快的(除了当第一部分返回 false和第二部分实际上需要求值的情况)。

| | 和 OR 以及 & & 和 AND 之间的区别是 运算符优先级 :

$bool = FALSE || TRUE;

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

$bool = FALSE OR TRUE;

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

$bool = TRUE && FALSE;

  • interpreted as ($bool = (TRUE && FALSE))
  • 值是 FALSE

$bool = TRUE AND FALSE;

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

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

假设代码是这样的:

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

当 $this-> position ()返回 false 或 null 时,您会期望(正如您在 javascript 中所习惯的那样) $position 是空数组。但事实并非如此。值是 TRUE 还是 FALSE 取决于 $this-> position ()返回什么。

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

$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进行测试