Answers:
没有“更好的”,但是更常见的是||
。它们具有不同的优先级,并且||
可以像通常期望的那样工作。
另请参阅:逻辑运算符(以下示例从此处获取):
// 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;
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()
。
||之间的区别 并且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
来源: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() ?? [];
可能是您想要的。
有些语言使用短路,而另一些语言则使用完整的布尔值评估(如果您知道,这类似于$B
Pascal中的指令)。
说明:
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
将不会被调用。除了优先级不同之外,两个运算符的功能完全相同。
$e = true || $x = 'foo'
不会$x
因为短路而不是较高的优先级来进行定义。