
区别只在运算符优先级,其他完全一致:|| 优先级高,or 优先级极低,低到和赋值 = 基本同级。 这不是风格偏好问题,而是写错就直接改变执行逻辑的硬性差异。
赋值语句里混用 or 会出人命
这是最典型、最容易翻车的场景。因为 or 的优先级比 = 还低,整个表达式会被断成「先赋值,再 or」:
-
$p = 6 or 0;等价于($p = 6) or 0;→$p得到6(整型),or 0白执行 -
$p = 6 || 0;等价于$p = (6 || 0);→$p得到true(布尔) - 同理:
$res = foo() or die('fail');是安全的——foo()先执行并赋值给$res,若失败才die;但换成||就不行:$res = foo() || die('fail');会把布尔结果赋给$res,且die永远不会触发
|| 和 or 都支持短路,但组合时行为不同
单独用都短路(左边为真就不算右边),但嵌套在复杂表达式中,优先级会决定分组方式:
-
$a || $b and $c→ 实际是($a || $b) and $c(因为|| > and) -
$a or $b and $c→ 实际是$a or ($b and $c)(因为and > or) - 更危险的是:
$a = $b or $c;和$a = $b || $c;完全是两回事,前者赋值后判断,后者先逻辑再赋值
什么时候该用 or?基本只有一种情况
除极少数明确依赖低优先级的控制流外,or 几乎没有存在必要。它的唯一合理用途是「赋值后兜底」:
$file = @file_get_contents($path) or die("无法读取 $path");$db = mysqli_connect(...) or exit("DB 连接失败");- 注意:这种写法依赖
or低于=,所以左边赋值成功后,右边才可能执行;换成||就破坏了这个意图 - 现代 PHP 更推荐用
??、?:或显式if,而不是靠or做流程控制
真正容易被忽略的是:哪怕你从不主动写 or,只要阅读老代码或某些框架底层(比如早期 Laravel 的 DB 查询构造器链式调用里隐含的逻辑),就可能撞上它。优先级不是理论知识,是运行时真实影响变量类型和流程走向的开关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











