PHP中|是位运算符,||是逻辑短路或;|逐位运算返回整数,||判断真值性并返回布尔值;二者语义、行为、类型均不同,不可混用。

PHP中|是位运算,||是逻辑短路或
|对两个操作数做逐位“或”运算,结果是整数(或布尔转整数后参与),不关心真假值含义;||只看表达式的“真值性”,一旦左边为真就立刻停止执行右边(短路),返回布尔值 true 或 false。两者语义、行为、返回类型完全不同,不能混用。
赋值语句里混用|和||会出大问题
常见错误是写成 $a = 1 | $b = 2 或 $a = 1 || $b = 2,表面想“设默认值”,实际因优先级导致意外赋值:
-
|优先级高于=,所以$a = 1 | $b = 2等价于$a = (1 | $b = 2)→ 先执行$b = 2,再算1 | 2(即3),最后$a = 3 -
||优先级也高于=,所以$a = 1 || $b = 2等价于$a = (1 || $b = 2)→ 左边1为真,短路,$b = 2根本不执行,$a得到布尔true(强制转为1) - 真正想“
$b为空时赋默认值”,该用isset($b) || $b = 'default';或更安全的$b = $b ?? 'default';
|| 和 or 看似一样,但优先级差很多
很多人以为 || 和 or 可互换,其实 || 优先级远高于 =,而 or 优先级低于 =:
-
$a = false || true;→ 先算false || true得true,再赋给$a,$a是true -
$a = false or true;→ 先执行$a = false,整个表达式变成(false) or true,但$a已经是false,true部分只是被丢弃的计算结果 - 同理,
&&和and也有同样陷阱,混用极易导致变量未按预期赋值
什么时候该用|,什么时候该用||
选哪个不取决于“看起来像或”,而取决于你要处理的是位模式还是条件判断:
立即学习“PHP免费学习笔记(深入)”;
- 用
|:设置权限掩码(如FILE_READ | FILE_WRITE)、合并二进制标志、底层数据操作 - 用
||:条件分支控制(if ($x || $y))、提供备选值($host = $_SERVER['HTTP_HOST'] || 'localhost';—— 注意这里实际应配合??或isset(),否则0或空字符串也会触发右侧) - 绝对别用
|替代||做条件判断,比如if ($a | $b)在$a=1, $b=2时为真,但$a=0, $b=2时仍为真(0|2 === 2),逻辑完全错乱
最易被忽略的一点:PHP 的 || 返回布尔值,而 | 返回整数;如果后续代码依赖返回值类型(比如传给函数参数、做严格比较),类型错位会导致静默 bug。别靠“结果看起来差不多”来判断是否可用。



















