【发布时间】:2011-08-25 07:03:04
【问题描述】:
我记得不久前读过关于逻辑运算符的文章,在 OR 的情况下,使用 || 比使用 or 更好(反之亦然)。
当它返回给我时,我只需要在我的项目中使用它,但我不记得推荐了哪个运算符,甚至不记得它是否正确。
哪个更好,为什么?
【问题讨论】:
标签: php operators logical-operators or-operator
我记得不久前读过关于逻辑运算符的文章,在 OR 的情况下,使用 || 比使用 or 更好(反之亦然)。
当它返回给我时,我只需要在我的项目中使用它,但我不记得推荐了哪个运算符,甚至不记得它是否正确。
哪个更好,为什么?
【问题讨论】:
标签: php operators logical-operators or-operator
一些语言使用短路,而其他语言使用完整的布尔评估(如果你知道的话,这类似于 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 将不会被调用。两个运算符的作用完全相同,只是优先级不同。
来源: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>
【讨论】:
我知道这是一个老话题,但仍然如此。我刚刚在工作中调试的代码中遇到了问题,也许有人可能有类似的问题...
假设代码如下所示:
$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 测试
【讨论】:
$positions = $this->positions() ?? []; 可能是您想要的。
分别||的区别和 OR 和 && 和 AND 是 operator precedence :
$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
【讨论】:
没有好坏之分,这取决于运算符的优先级。由于|| 的优先级高于or,所以|| 的使用较多。
【讨论】:
我不认为一个天生就比另一个更好,但我建议坚持使用 ||因为它是大多数语言的默认设置。
编辑:正如其他人指出的那样,两者之间确实存在差异。
【讨论】:
没有“更好”,但更常见的是||。他们有不同的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 因为短路,而不是因为更高的优先级。
27 or 0 为我返回 27。
or 也返回布尔值是对的。只是它的优先级太低,以至于有时看起来就像它在做其他事情。 :) print 27 or 0 将打印 27 因为or 发生在之后 print 27。顺便说一句,echo 不会被愚弄——echo 27 or 0 会输出1。
它们用于不同的目的,实际上具有不同的运算符优先级。 && 和 || 运算符用于布尔条件,而 and 和 or 用于控制流。
例如,以下是一个布尔条件:
if ($foo == $bar && $baz != $quxx) {
这与控制流不同:
doSomething() or die();
【讨论】:
die() 如果doSomething() 将返回false 或null,将调用函数?如果doSomething() 返回true 或什么都不返回怎么办?
doSomething() 被评估为布尔值。如果它返回一个 PHP 认为是真的值(true、非空字符串等),它不会调用die()。