首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 逻辑运算符优先级与短路求值完全指南

     編輯:PHP 相關知識

运算符优先级(高 → 低)

  1. ! (逻辑非)
  2. && (逻辑与)
  3. || (逻辑或)
  4. and (逻辑与,低优先级)
  5. xor (逻辑异或)
  6. 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

详细解析第二个例子

  1. 3 || $b = 3:3 为真 → 短路,$b = 3 不执行。
  2. 整个表达式值为 true(布尔值)。
  3. $a = true 赋值成功,if 条件成立。
  4. 进入块内:$a++ → true (1),$b++ → 0+1=1。

最佳实践:始终使用括号明确意图

<?php
// 推荐:清晰、无歧义
if (($a = 3) || ($b = 3)) { ... }

// 避免:依赖优先级的隐式行为
if ($a = 3 || $b = 3) { ... }

and/or 与 &&/|| 的实用区别

低优先级 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
truetruetruetruefalsefalse
truefalsefalsetruetruefalse
falsetruefalsetruetruetrue
falsefalsefalsefalsefalsetrue

特殊规则:! 优先级高于 =

<?php
if (!$a = foo()) { ... }
// 解析为:if (!($a = foo())) { ... }
// 即:先执行 foo() 赋值给 $a,再取反判断
// 这是 PHP 故意允许的特例,方便「赋值后判断」模式

总结

  1. 优先级:! > && > || > and > xor > or。
  2. 短路:利用短路避免不必要计算、防空指针($obj && $obj->method())。
  3. 括号:复杂表达式必须加括号,消除歧义、提升可读性。
  4. 符号 vs 英文:表达式用 && || !;流程控制链可用 and or。
  5. 赋值混用:极易出错,避免在 if/while 条件中直接赋值,或用括号隔离。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved