是,php中&&默认短路求值:左操作数为假时跳过右操作数执行,影响副作用触发、安全检查及类型转换行为,需警惕隐式布尔转换和优先级陷阱。

会,而且默认就是短路的。 PHP 中的 && 不仅是逻辑与运算符,它天然具备短路求值行为——只要左边表达式为 false(或能转为 false 的值),右边整个表达式根本不会执行。
为什么 && 短路在实际代码里很关键
这不是语法糖,而是直接影响副作用是否发生。比如函数调用、赋值、数据库查询这类有“动作”的操作,一旦被放在 && 右侧,就可能被跳过。
- 常见错误:把带副作用的赋值写在右边,误以为总会执行
$user = getUser() && $log->record('fetched');—— 如果getUser()返回null或false,$log->record()根本不触发 - 典型安全用法:先检查变量存在,再访问属性
isset($config['db']['host']) && $pdo = new PDO($config['db']['host']); - 别和
and混用:虽然and也短路,但优先级比=还低,容易引发赋值顺序错误,比如$a = $b and $c = true;实际等价于($a = $b) and ($c = true);,而$a = $b && $c = true;是$a = ($b && $c = true);
&& 短路时的类型转换陷阱
PHP 松散判断 false 的范围比直觉宽得多:整数 0、浮点数 0.0、空字符串 ''、字符串 "0"、空数组 []、null 都会被当成 false。这在短路中极易导致意外跳过。
- 比如:
$id = "0"; if ($id && $user = findUser($id)) { ... }——$id是字符串"0",松散转为布尔就是false,findUser()压根不调用 - 修复方式:显式判断,避免依赖隐式转换
if ($id !== "" && $id !== "0" && $user = findUser($id)) { ... }
或更稳妥地用严格比较:if (is_string($id) && $id !== "" && $user = findUser($id)) { ... }
多个 && 连用时的执行顺序
从左到右依次短路,不是一次性全看。比如 $a && $b && $c && $d:
- 若
$a为false,$b、$c、$d全部跳过 - 若
$a为true但$b为false,则$c和$d跳过 - 只有前面全部为真,才会走到最右边;所以把开销小、失败概率高的条件放左边更高效
- 注意:不要写成
$a && $b = someExp()这种形式,除非你明确需要短路赋值;否则易读性差,且容易和and混淆
真正容易被忽略的是:短路不是“优化技巧”,它是 PHP 解析器层面的强制行为。你写的每个 && 都在悄悄跳过右侧代码——哪怕那行代码是你精心写的日志、清理或回滚逻辑。写之前,先问一句:如果左边挂了,右边这行还该不该跑?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











