PHP中&是按位与运算符,用于整数二进制位逐位比较(同为1得1),权限判断应写为$userPerm & READ;逻辑“与”必须用&&,误用&或and会导致类型转换错误或优先级问题。

PHP中&是位运算符,不是“并且”逻辑判断
很多人写if ($a & $b)想表达“$a 和 $b 都为真”,结果出错——&根本不看真假值,它只把两个操作数转成整数、再逐位做“都为1才得1”的二进制运算。浮点数、字符串、null全被静默转成 0,比如'12' & '3'结果是 0,不是你想的 12 & 3(即 0)。
逻辑“与”该用 &&;权限/状态判断才用 &。别拿 and 替代——它优先级比 = 还低,$a = 5 and 3 实际执行的是 $a = 5,然后丢弃 true and 3 的结果。
- 要判断权限:用
$userPerm & READ,不是$userPerm and READ - 调试时直接
var_dump($perm & FLAG_A),看输出是不是非零 - 确保输入是整数:
(int)$a & (int)$b比依赖隐式转换更安全
权限系统里&怎么判断是否拥有某权限
权限通常用 2 的幂定义:READ = 1(0001)、WRITE = 2(0010)、EXECUTE = 4(0100)。用户权限是这些值的和(即按位或组合),比如 $userPerm = 5 表示 READ | EXECUTE(0001 | 0100 = 0101)。
判断是否含某权限,就用 &:只有对应位都是 1,结果才非零。
立即学习“PHP免费学习笔记(深入)”;
-
$userPerm & READ→5 & 1→0101 & 0001 = 0001→ 非零,有读权限 -
$userPerm & WRITE→5 & 2→0101 & 0010 = 0000→ 零,无写权限 - 注意:不要写成
if ($userPerm & READ === READ),因为===优先级高于&,实际算的是$userPerm & (READ === READ),而READ === READ是true(即1),逻辑全乱
&在状态标记和奇偶判断中的轻量用法
除了权限,&也常用于快速提取或校验特定位。比如判断一个数是否为奇数:$n & 1——因为所有奇数二进制末位都是 1,偶数都是 0,所以结果是 1 或 0,比 $n % 2 === 1 更快且不依赖取模实现。
- 提取低 4 位:
$x & 15(15是1111) - 清零低 3 位(保留高位):
$x & ~7(7是111,~7把低 3 位变0,其余变1) - 检查第 n 位是否开启(从 0 开始):
$x & (1 ,比如第 3 位就是 <code>$x & 8
容易忽略的类型陷阱和符号问题
& 输入必须是整数。PHP 会把非整数静默转成 0,但这个过程不可见,错误很难定位。更隐蔽的是负数:PHP 整数是有符号的,~ 和移位配合 & 时,补码表示会让结果看起来像负数(比如 ~5 得 -6),如果后续再跟 & 运算,可能因符号扩展导致高位干扰。
- 永远显式转整型:
(int)$input & (int)$mask - 避免对负数做位运算,除非你明确需要补码行为
- 用
dechex()或decbin()辅助调试,比如echo decbin(5), ' & ', decbin(3), ' = ', decbin(5 & 3);
真正难的不是记住规则,而是每次写 & 前都下意识确认:输入确实是整数?本意是位操作,不是逻辑判断?那个 1 的括号加对了没?



















