根本原因是优先级不同:&&优先级高于=,而and优先级低于=,导致解析顺序截然不同;$a = true && false结果为false,$a = true and false结果为true。

赋值语句里 && 和 and 会得到完全不同的结果
根本原因在于优先级:&& 的优先级远高于赋值操作符 =,而 and 的优先级甚至低于 =。这意味着在没有括号的情况下,PHP 解析顺序完全不同。
-
$a = true && false;等价于$a = (true && false);→$a是false -
$a = true and false;等价于($a = true) and false;→$a是true,false被丢弃(只用于短路判断)
这种差异不是“看起来一样”,而是直接改变变量值——线上 bug 往往就藏在这种看似无害的替换里。
条件判断中一律用 &&,别碰 and
在 if、while、elseif 这类控制结构里,and 没有任何优势,只有风险。
-
if ($user && $user->isActive())—— 安全、直观、符合直觉 -
if ($user and $user->isActive())—— 语法合法,但一旦后续加了赋值或更复杂表达式,极易因优先级混乱出错 - 团队代码规范通常明令禁用
and/or,不是矫情,是吃过亏后的共识
你不需要记住“什么时候该用 and”,只需要记住:只要出现在 if 括号里,它就是错的。
and 唯一合理的使用场景:副作用链式兜底
极少数情况下,and 的低优先级反而能简化逻辑,前提是左边表达式必须成功执行,且右边只是“附带动作”。
-
$db = connect_db() and register_shutdown_function('close_db');—— 只有connect_db()返回真值(非false/null),才注册关闭函数 -
$config = load_config('prod.php') or die('config missing');—— 注意这里是or,同理,or优先级也低于=,适合失败兜底 - 不能反过来写:
register_shutdown_function('close_db') and $db = connect_db();—— 这会先注册函数,再连库,语义完全颠倒
这种写法本质是利用运算符优先级做“执行顺序断言”,不是逻辑判断;一旦逻辑变复杂,立刻换成显式 if 更清晰。
混用 && 和 and 是最危险的操作
哪怕只是想“统一风格”,也不要在一个表达式里同时出现两者。PHP 运算符优先级顺序是:&& > || > and > or,混用等于主动放弃对求值顺序的控制。
-
if ($a && $b or $c and $d)实际等价于if (($a && $b) || ($c and $d)),但没人能一眼看出来 - 加上括号可读性反而下降,不如全用
&&/||并拆成多行或提前返回 - 静态分析工具(如 PHPStan)通常会警告
and/or的使用,不是小题大做
真正容易被忽略的点是:这个区别不会报错,也不会触发 notice,它只是悄悄让变量变成本不该有的值——上线后查日志都难定位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











