php中and优先级低于=,导致$a = false and true被解析为($a = false) and true,$a恒为false而整体表达式结果被丢弃;应统一使用&&避免逻辑错误。

PHP中and的优先级比=还低
这不是你的表达式写错了,是PHP运算符优先级规则在“背刺”。and(以及or)的优先级低于赋值运算符=,所以$a = false and true;实际被解析为($a = false) and true;——赋值先完成,整个表达式结果是true,但$a早已被设为false,而你根本没机会拿到这个and的结果。
-
and、or仅用于控制流程逻辑,比如do_something() and log_success(); - 真要组合赋值和逻辑判断,必须用
&&:$a = false && true;→$a得到false - 想让
and参与赋值?加括号:$a = (false and true);,但这纯属绕弯,不如直接用&&
常见错误现象:变量值和预期完全不一致
比如这段代码:
$user = find_user($id) and $user->is_active();
你以为$user只在查到用户且激活时才被赋值?错。它永远等于find_user($id)的返回值(比如User对象或null),后面的and只是单独执行$user->is_active()并丢弃结果。如果$user是null,这里还会抛出Call to a member function is_active() on null。
- 这种写法常出现在老项目或从其他语言迁移过来的开发者代码里
-
and右侧的表达式仍会执行,但它的布尔结果不会影响左侧赋值 - 静态分析工具(如PHPStan)通常会警告这种无意义的
and链
什么时候该用and,什么时候必须用&&
关键看你要不要“把整个逻辑表达式的布尔结果存下来”。
- 用
&&:需要短路求值 + 结果参与后续计算,比如$can_edit = $user && $user->has_role('editor'); - 用
and:纯粹做“前置条件满足才执行后操作”,且不关心整体真假,比如$file = fopen($path, 'r') and flock($file, LOCK_SH); - 混用会出事:
$success = connect_db() and query($sql);→$success是connect_db()的返回值,不是查询是否成功
兼容性与性能其实不是问题,认知偏差才是
and和&&生成的OPCODE几乎一样,性能差异可忽略。真正的问题在于:团队协作时,别人读到$x = $a and $b;第一反应是“这想干啥?”,而不是“哦,这是个低优先级逻辑连接”。PHP官方文档也明确建议:除非写shell式单行命令,否则统一用&&/||。
最稳妥的做法,就是把and当成一个“仅用于if条件末尾或独立语句”的特殊符号,别让它靠近=。否则,你调试时看到的变量值,和你以为自己写的逻辑,根本不在同一个宇宙里。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











