php中&&和||会短路:左边结果足以确定整体逻辑值时,右边表达式完全不执行,包括函数调用、赋值等副作用;&&在左为falsy时跳过右,||在左为truthy时跳过右。

&& 和 || 在 PHP 中确实会短路,但关键不是“会不会”,而是“什么时候短路”以及“短路后表达式怎么算”。直接说结论:只要左边表达式的结果足以确定整个逻辑结果,右边就完全不执行——包括函数调用、赋值、自增等任何副作用操作。
&& 短路时右边表达式彻底不运行
&& 是“逻辑与”,它要求两边都为真才返回真。所以一旦左边是 falsy(如 false、0、''、null、[]),整个表达式必为假,PHP 就跳过右边。
常见错误现象:
- 写了
$user = getUser() && $user->isActivated(),但getUser()返回null时,$user->isActivated()根本不会调,也不会报错(因为没执行) - 更隐蔽的是赋值混用:
$a == 1 && $b = 10,当$a == 1为 false 时,$b保持原值,不会被赋成 10
使用场景:
- 安全访问嵌套属性:
$data && $data['user'] && $data['user']['id'] - 条件初始化:
!defined('DEBUG') && define('DEBUG', true)
注意点:
-
&&优先级高于=,所以$a && $b = 5等价于$a && ($b = 5),不是($a && $b) = 5 - 不要和
and混用——and优先级比=还低,$a = false and true实际是($a = false) and true,$a变成false,但整个表达式结果被丢弃
|| 短路时右边表达式彻底不运行
|| 是“逻辑或”,只要左边为 truthy,整个结果就是真,右边直接跳过。
常见错误现象:
-
$file = fopen($path, 'r') || die('open failed')看似简洁,但fopen()失败返回false,触发die();可一旦fopen()成功,返回资源(truthy),die()就不会执行——这没问题;但若写成$file = fopen($path, 'r') or die('open failed'),由于or优先级太低,实际是($file = fopen(...)) or die(...),即使fopen()失败,$file已被赋值为false,die()仍会执行,逻辑反而失控
使用场景:
- 默认值兜底:
$host = $_SERVER['HTTP_HOST'] ?: 'localhost'更推荐,但老代码里常见$host = $_SERVER['HTTP_HOST'] || 'localhost'——注意这里如果$_SERVER['HTTP_HOST']是空字符串,也会触发右边,因为''是 falsy - 错误恢复:
connectToDB() || fallbackToCache(),前提是两个函数都有明确的 truthy/falsy 返回约定
性能影响:
- 短路本身开销极小,但能避免无谓的 IO、数据库查询或重计算。比如
isValidToken($t) && verifyUser($t),token 格式都不对,就没必要进验证逻辑
&& 和 || 混用时优先级陷阱最危险
PHP 中 && 优先级高于 ||,而两者又都远高于 =。这意味着:
-
$a = false || true && false等价于$a = (false || (true && false))→$a = false - 但
$a = false or true and false等价于($a = false) or (true and false)→$a = false,且后面部分白执行
最容易被忽略的一点:
-
没有括号时,
&&和||的组合行为完全取决于优先级,而不是从左到右顺序。比如$x = $a || $b && $c,不是先算$a || $b,而是先算$b && $c,再跟$a做||
如果你在条件里同时用多个逻辑运算符,又没加括号,几乎肯定踩坑。宁可多敲几个括号,也别靠记忆优先级表硬扛。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











