or优先级低于=,故$a=$b or $c等价于($a=$b) or $c;||优先级高于=,故$a=$b||$c等价于$a=($b||$c);二者短路行为相同但适用场景不同。

or 的优先级比 = 还低
PHP 里 or 不是“逻辑或”那么简单,它在运算符优先级表里排得比赋值运算符 = 还靠后。这意味着 $a = $b or $c 实际被解析为 ($a = $b) or $c,而不是你直觉以为的 $a = ($b or $c)。
所以你写 $result = some_func() or die('fail'); 是能跑通的——因为 some_func() 先执行并赋值给 $result,之后才判断 $result or die(...);但如果你本意是“把函数返回值或默认值赋给变量”,比如想写 $x = $y or 'default',结果 $x 拿到的永远是 $y 的原始值(哪怕它是 false 或 null),后面的 'default' 根本不参与赋值。
-
$x = false or 'default';→$x是false,不是'default' -
$x = true or 'default';→$x是true,'default'被丢弃 - 真正想做“空值 fallback”,该用
??或三元:$x = $y ?? 'default';
和 || 混用导致逻辑错乱
很多人在同一个表达式里混用 or 和 ||,比如 if ($a || $b or $c)。这看起来没问题,但 PHP 会按优先级分组:先算 $a || $b(高优先级),再拿结果跟 $c 做 or(低优先级)。虽然最终布尔结果可能碰巧对,但可读性差,而且一旦加了赋值或函数调用,就极易出错。
- 错误示范:
$flag = $a || $b or $c;→ 等价于$flag = ($a || $b) or $c;,$flag只能是true或false,不是你想存的三元结果 - 正确做法:统一用
||做条件判断,用??或?:做值选择 - 真要链式 fallback:
$x = $a ?: ($b ?: $c);或$x = $a ?? $b ?? $c;
在 if 条件里误用 or 导致短路失效
or 和 || 都是短路运算符,但优先级差异会让短路行为“看起来没发生”。典型陷阱是把 or 放在赋值右侧又嵌套在 if 中:
$user = get_user() or die('no user');
if ($user and $user['active']) { ... }
这段代码的问题在于:如果 get_user() 返回 false,die() 执行,脚本终止;但如果它返回 null 或空数组,$user 就是那个假值,而 if 里的 $user and $user['active'] 会因 $user 为 false 直接跳过——你以为 or 会兜底,其实它只管自己那条语句的“失败后执行”,不改变后续逻辑流。
-
or只控制它紧邻的两个表达式,不辐射整个if块 - 更安全的写法:
$user = get_user(); if (!$user) die('no user'); - 或者用异常机制:
$user = get_user() ?: throw new RuntimeException('no user');(PHP 8.0+)
为什么 die() 配 or 看起来能用
像 $db = connect() or die('fail'); 这种写法之所以“有效”,纯粹是因为 or 的低优先级让它成了“赋值后检查”的语法糖:先完成 $db = connect(),再用 $db 的真假决定是否执行 die()。但它本质不是“赋值运算”,而是两条语句的紧凑拼接。
- 它不能用于函数参数、数组键、返回值等需要真实布尔结果的上下文
- 现代 PHP 更推荐显式判断:
if (!$db = connect()) { die('fail'); } - 团队协作中,这种写法容易让新人误以为
or是普通逻辑或,埋下维护隐患
真正危险的不是 or 本身,是你以为它和 || 行为一致。它的低优先级在赋值场景下几乎总是反直觉的,除非你刻意利用它做“失败退出”,否则一律换用 ||、?? 或显式分支。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











