! (逻辑非)&& (逻辑与)|| (逻辑或)and (逻辑与,低优先级)xor (逻辑异或)or (逻辑或,低优先级)记忆口诀: 符号形式(! && ||)优先级高于英文形式(and xor or)。
&& / and:左侧为 false → 直接返回 false,不执行右侧。|| / or:左侧为 true → 直接返回 true,不执行右侧。<?php
// 位运算符 | 优先级 > 赋值 =
$a = 0; $b = 0;
if ($a = 3 | $b = 3) { // 解析为 $a = (3 | ($b = 3))
$a++; $b++;
}
echo "$a, $b"; // 4, 4
// 逻辑运算符 || 优先级 < 赋值 =,但会短路
$a = 0; $b = 0;
if ($a = 3 || $b = 3) { // 解析为 $a = (3 || ($b = 3))
$a++; $b++;
}
echo "$a, $b"; // 1, 1
3 || $b = 3:3 为真 → 短路,$b = 3 不执行。true(布尔值)。$a = true 赋值成功,if 条件成立。$a++ → true (1),$b++ → 0+1=1。<?php
// 推荐:清晰、无歧义
if (($a = 3) || ($b = 3)) { ... }
// 避免:依赖优先级的隐式行为
if ($a = 3 || $b = 3) { ... }
低优先级 and/or 常用于流程控制链,而非表达式求值:
<?php
// 典型用法:执行 A,失败则执行 B
$result = doSomething() or logErrorAndExit(); // doSomething 返回 false 时执行后者
// 等价于(但更啰嗦)
if (!doSomething()) {
logErrorAndExit();
}
// 符号形式 || 优先级高,用在表达式中
$config = $userConfig || $defaultConfig; // 表达式求值
| $a | $b | $a && $b | $a || $b | $a xor $b | ! $a |
|---|---|---|---|---|---|
| true | true | true | true | false | false |
| true | false | false | true | true | false |
| false | true | false | true | true | true |
| false | false | false | false | false | true |
<?php
if (!$a = foo()) { ... }
// 解析为:if (!($a = foo())) { ... }
// 即:先执行 foo() 赋值给 $a,再取反判断
// 这是 PHP 故意允许的特例,方便「赋值后判断」模式
! > && > || > and > xor > or。$obj && $obj->method())。&& || !;流程控制链可用 and or。if/while 条件中直接赋值,或用括号隔离。