逻辑运算符

逻辑运算符
示例 名称 结果
$a and $b 并且 true 如果 $a$b 都是 true
$a or $b 或者 true 如果 $a$btrue
$a xor $b 异或 true 如果 $a$btrue,但不是两者。
! $a true 如果 $a 不是 true
$a && $b 并且 true 如果 $a$b 都是 true
$a || $b 或者 true 如果 $a$btrue

使用两种不同的“and”和“or”运算符的原因是它们具有不同的优先级。(请参见 运算符优先级。)

示例 #1 逻辑运算符说明

<?php

// --------------------
// foo() 永远不会被调用,因为这些运算符是短路运算符

$a = (false && foo());
$b = (true || foo());
$c = (false and foo());
$d = (true or foo());

// --------------------
// "||" 的优先级高于 "or"

// 表达式 (false || true) 的结果被赋值给 $e
// 类似于:($e = (false || true))
$e = false || true;

// 在 "or" 运算发生之前,常量 false 被赋值给 $f
// 类似于:(($f = false) or true)
$f = false or true;

var_dump($e, $f);

// --------------------
// "&&" 的优先级高于 "and"

// 表达式 (true && false) 的结果被赋值给 $g
// 类似于:($g = (true && false))
$g = true && false;

// 在 "and" 运算发生之前,常量 true 被赋值给 $h
// 类似于:(($h = true) and false)
$h = true and false;

var_dump($g, $h);
?>

上面的示例将输出类似于

bool(true)
bool(false)
bool(false)
bool(true)
添加注释

用户贡献的注释 14 个注释

301
Lawrence
16 年前
请注意,PHP 的布尔运算符 *始终* 返回一个布尔值……与返回最后一个计算表达式的值的其它语言不同。

例如

$a = 0 || 'avacado';
print "A: $a\n";

将在 PHP 中打印

A: 1

与在 Perl 或 JavaScript 等语言中打印 "A: avacado" 不同。

这意味着您不能使用 '||' 运算符设置默认值

$a = $fruit || 'apple';

相反,您必须使用 '?:' 运算符

$a = ($fruit ? $fruit : 'apple');
65
dumitru at floringabriel dot com
7 年前
除了 Lawrence 关于分配默认值的说法之外,现在还可以使用 Null 合并运算符(PHP 7)。因此,当我们想要分配默认值时,我们可以写

$a = ($fruit ?? 'apple');
// 如果 $fruit 变量存在或具有非 NULL 的值,则将 $fruit 变量的内容分配给 $a,否则,如果 $fruit 变量不存在或包含 NULL 值,则将值 'apple' 分配给 $a
23
thisleenobleNOSPAMPLEASE at mac dot com
7 年前
为了模拟 JavaScript 在表达式中分配第一个非假值的这种方式

var v = a || b || c || d;

我写了一个小的辅助方法,我将其放在函数转储库中(这里显示为一个裸函数)

<?php
function either($a, $b){
$val = $a ? $a : $b;
/*
是的,我知道函数中的固定参数
是多余的,因为我可以使用 func_get_args,
但在大多数情况下,我会使用它来替换
三元运算符,并且只传递两个值。
除非我 *真的* 需要,否则我不希望调用下面的额外进程。
*/
$args = func_get_args();
if(
$val === false && count($args) > 2){
$args = array_slice($args, 2);

foreach(
$args as $arg){
if(
$arg !== false){
$val = $arg;
break;
}
}
}
return
$val;
}
?>

现在,不用写

$v = $a ? $a : $b;

我写

$v = either($a, $b);

但更重要的是,不用写

$v = $a ? $a : ($b ? $b : $c);

我写

$v = either($a, $b, $c);

或者确实

$v = either($a, $b, $c, $d, $e, $f, $g, $h);
53
pepesantillan at gmail dot com
16 年前
值得学习 PHP 和编程的人阅读:(添加额外的 <?php ?> 以获得突出显示的代码)

关于此页面手册中的以下示例
示例 #1 逻辑运算符说明

...
<?php
// "||" 的优先级高于 "or"
$e = false || true; // $e 将被赋值为 (false || true),即 true
$f = false or true; // $f 将被赋值为 false
var_dump($e, $f);

// "&&" 的优先级高于 "and"
$g = true && false; // $g 将被赋值为 (true && false),即 false
$h = true and false; // $h 将被赋值为 true
var_dump($g, $h);
?>
_______________________________________________end of my quote...

如有必要,我想进一步解释一下,当我们写
$f = false or true; // $f 将被赋值为 false
解释

"||" 的优先级高于 "or"

这是正确的。但更准确的说法应该是

"||" 的优先级高于 "or" 和 "=", 而 "or" 的优先级不高于 "=", 所以

<?php
$f
= false or true;

// 等同于写

($f = false ) or true;

// 以及

$e = false || true;

等同于

$e = (false || true);

?>

对于 "&&" 和 "AND" 也是一样的。

如果你难以记住运算符的优先级,你始终可以使用圆括号 - "(" 和 ")"。即使你记住了优先级,也要记住成为一名优秀的程序员不是用最少的代码来完成任务。优秀的程序员应该编写易于理解(必要时注释你的代码!)、易于维护、效率高的代码,以及其他因素。
13
egst
3 years ago
针对 Lawrence 关于 || 始终返回布尔值的观点

代替

$x ? $x : 'fallback'

你也可以使用 "Elvis 操作符"

$x ?: 'fallback'

这在三元运算符左侧表达式过长、计算两次过于复杂或存在副作用的情况下非常有用。

它还可以很好地与 ?? 操作符结合使用,?? 操作符等效于 empty() 检查(既有 isset() 又有 `!= false`)

$x->y ?? null ?: 'fallback';

代替

empty($x->y) ? $x->y : 'fallback'
2
martinholtcbi at gmail dot com
1 year ago
在 PHP 中,|| 操作符始终只返回布尔值。对于可链式赋值操作符,请使用 ?: "Elvis" 操作符。

JavaScript
let a = false;
let b = false;
let c = true;
let d = false;
let e = a || b || c || d;
// e === c

<?PHP
$a
= false;
$b = false;
$c = true;
$d = false;
$e = $a ?: $b ?: $c ?: $d;
// $e === $c
?>

感谢 @egst 和其他人的见解。这只是针对像我这样的(曾经)迷失的 JavaScript 开发者重新整理一下。
21
phpnet at zc dot webhop dot net
11 years ago
这与 JavaScript 的短路赋值和设置默认值类似。(例如,var a = getParm() || 'a default';)

<?php

($a = $_GET['var']) || ($a = 'a default');

?>

如果 $_GET['var'] 中有内容,则 $a 会被赋值为 $_GET['var'],否则它将回退到 'a default'
圆括号是必需的,否则 $a 会变成一个布尔值。
19
momrom at freenet dot de
15 years ago
逻辑表达式的求值在结果已知时停止。
如果你不希望这样,你可以用 min() 替换 and 运算符,用 max() 替换 or 运算符。

<?php
function a($x) { echo 'Expression '; return $x; }
function
b($x) { echo 'is '; return $x; }
function
c($x) { echo $x ? 'true.' : 'false.' ;}

c( a( false ) and b( true ) ); // 输出:Expression false.
c( min( a( false ), b( true ) ) ); // 输出:Expression is false.

c( a( true ) or b( true ) ); // 输出:Expression true.
c( max( a( true ), b( true ) ) ); // 输出:Expression is true.
?>

通过这种方式,值不会像使用 and 或 or 时那样自动转换为布尔值。因此,如果你不确定值是否已经是布尔值,你必须手动转换。

<?php
c
( min( (bool) a( false ), (bool) b( true ) ) );
?>
13
Andrew
17 years ago
> <?php
> your_function() or return "whatever";
>
?>

不起作用,因为 return 不是表达式,它是一个语句。如果 return 是一个函数,它就可以正常工作。:/
5
anatoliy at ukhvanovy dot name
10 years ago
如果你想使用 '||' 运算符来设置默认值,例如

<?php
$a
= $fruit || 'apple'; // 如果 $fruit 评估为 FALSE,则 $a 将被设置为 TRUE(因为 (bool)'apple' == TRUE)
?>

相反,您必须使用 '?:' 运算符

<?php
$a
= ($fruit ? $fruit : 'apple');// 如果 $fruit 评估为 FALSE,则 $a 将被设置为 'apple'
?>

但 $fruit 会被评估两次,这是不可取的。例如,fruit() 会被调用两次
<?php
function fruit($confirm) {
if(
$confirm)
return
'banana';
}
$a = (fruit(1) ? fruit(1) : 'apple');// fruit() 会被调用两次!
?>

但由于 “从 PHP 5.3 开始,可以省略三元运算符的中间部分”(https://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary),现在你可以这样编写代码

<?php
$a
= ($fruit ? : 'apple'); // 这将只评估 $fruit 一次,如果它评估为 FALSE,则 $a 将被设置为 'apple'
?>

但请记住,非空字符串 '0' 会评估为 FALSE!

<?php
$fruit
= '1';
$a = ($fruit ? : 'apple'); // 这行代码将 $a 设置为 '1'
$fruit = '0';
$a = ($fruit ? : 'apple'); // 这行代码将 $a 设置为 'apple',而不是 '0'!
?>
7
peter dot kutak at NOSPAM dot gmail dot com
16 年前
$test = true and false; ---> $test === true
$test = (true and false); ---> $test === false
$test = true && false; ---> $test === false

注意:这是因为第一行实际上是

($test = true) and false;

这是因为 "&&" 的优先级高于 "=",而 "and" 的优先级较低。
2
void at informance dot info
10 years ago
为了在变量赋值中赋予默认值,对我来说最简单的解决方案是

<?php
$v
= my_function() or $v = "default";
?>

它之所以有效,是因为首先,$v 被赋值为 my_function() 的返回值,然后该值被作为逻辑运算的一部分进行评估
* 如果左侧为 false、null、0 或空字符串,则必须评估右侧,并且由于 'or' 优先级较低,所以 $v 被赋值为字符串 "default"
* 如果左侧不是上述任何值,则逻辑运算结束,$v 保持 my_function() 的返回值

这与 [phpnet at zc dot webhop dot net] 的解决方案几乎相同,只是他的解决方案(括号和双管道)没有利用 "or" 的低优先级。

注意:""(空字符串)被评估为 FALSE 逻辑操作数,因此请确保空字符串不是 my_function() 的可接受值。如果您需要将空字符串视为可接受的返回值,则必须使用传统的 "if" 方式。
3
brian at zickzickzick dot com
11 years ago
之前已经提过这个问题,但以防万一你错过了

<?php
// 默认值 --

// 如果您试图从以下代码中获取 'Jack':
$jack = false or 'Jack';

// 请尝试:
$jack = false or $jack = 'Jack';

// 另一个选择是:
$jack = false ? false : 'Jack';
?>
2
samantha at adrichem dot nu
9 年前
<?php
$res
|= true;
var_dump($res);
?>

不再返回布尔值(php 5.6),而是返回整数 0 或 1
To Top