&& 优先级远高于 and,且高于赋值运算符 =,而 and 优先级低于 =;混用易致静默 bug,如 $a = true and false 中 $a 被赋值为 true;PHP 官方及主流框架均推荐统一使用 &&,避免使用 and。

PHP 中 and 和 && 的优先级差异会直接导致 bug
它们语义相同(都表示逻辑与),但优先级不同:&& 优先级远高于 and,甚至高过赋值运算符 =;而 and 的优先级比 = 还低。这意味着在混合使用时,表达式求值顺序完全不同。
-
$a = true && false;等价于$a = (true && false);→$a是false -
$a = true and false;等价于($a = true) and false;→$a是true,整个表达式结果为false,但赋值已经完成 - 这种差异在条件链、错误处理中极易引发静默错误,比如
$result = query() and $log->info('done');实际上先赋值再判断,$log->info()总会执行
什么时候该用 &&,什么时候能用 and?
&& 是常规逻辑组合的唯一推荐选择;and 几乎只在极少数控制流场景中“凑合”用,且必须加括号明确意图。
- 日常判断一律用
&&:例如if ($user && $user->is_active)、$id = $input['id'] ?? null; if ($id && is_numeric($id)) { ... } -
and若非必要,建议完全回避;若真要模仿「短路执行 + 后续操作」风格(如旧代码兼容),必须显式加括号:($conn = connect_db()) and $conn->query($sql); - 现代 PHP 更推荐用空合并、nullsafe 或单独 if 分支替代这类写法,可读性与安全性更高
真实踩坑案例:数据库查询后误判失败状态
这段代码看似想“连接失败就退出”,但实际逻辑错乱:
$db = mysqli_connect($host) or die('connect failed');<br>$result = mysqli_query($db, $sql) and mysqli_free_result($result);
问题出在第二行:and 优先级太低,等价于 ($result = mysqli_query($db, $sql)) and mysqli_free_result($result); —— 即使 mysqli_query() 返回 false,$result 仍被赋值为 false,然后 mysqli_free_result(false) 触发警告。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法应是:
$result = mysqli_query($db, $sql); if ($result) { mysqli_free_result($result); } - 或用
&&保证短路逻辑:$result = mysqli_query($db, $sql) && mysqli_free_result($result);(但此时$result变成布尔值,丢失原结果对象) - 真正安全的做法是不依赖运算符优先级做副作用操作
PHP 官方态度和实际工程建议
PHP 手册明确将 and/or/xor 列为“低优先级逻辑运算符”,并标注“仅用于控制结构,不建议用于复杂表达式”。这不是风格偏好,而是语言设计层面的警示。
- 所有主流 PHP 静态分析工具(如 PHPStan、Psalm)默认对
and/or在赋值/函数调用中发出警告 - Laravel、Symfony 等框架源码中几乎找不到
and用于逻辑判断的用例,全部统一为&&和|| - 团队协作中,混用
and和&&会显著增加 code review 成本,且难以通过测试覆盖优先级陷阱











