PHP运算符易出错的主因是优先级、隐式类型转换及==与===混用;%仅支持整数、/总返回float、除零返回INF/NAN;比较首选===;??只判null,位运算需注意优先级和平台差异。
PHP 运算符本身不难,但初学者常卡在「为什么结果不是我预期的」——问题往往出在优先级、类型隐式转换、或 == 和 === 混用上。
PHP 的 +、-、*、/、% 行为接近其他语言,但有两个实际坑点:
% 只支持整数操作数,若传入浮点数(如 10.5 % 3),PHP 会先截断为整数(变成 10 % 3),不报错但易误判/ 永远返回 float 类型,哪怕结果是整数(6 / 2 得 3.0,不是 3);想取整用 intdiv(6, 2) 或 (int)(6 / 2)
INF、-INF 或 NAN,需用 is_infinite() 或 isnan() 主动检查==,=== 才是日常首选这是初学者最常翻车的地方。PHP 的松散比较 == 会自动类型转换,导致诡异结果:
$a = 0; $b = ''; $c = '0'; var_dump($a == $b); // true(int 0 == string '' → 都转成 0) var_dump($a == $c); // true(int 0 == string '0' → string '0' 转成 int 0) var_dump($a === $c); // false(类型不同,绝不相等)
除非你明确需要类型宽松比较(比如表单提交的字符串数字与数据库 int 字段比对且已确认安全),否则一律用 === 和 !==。另外注意:
(宇航员运算符)用于安全排序,返回 -1/0/1,避免 strcmp() 或手动写 if 判断?? 是空合并运算符,只检测 null 或未定义,不检测空字符串、0、false —— 想判断“假值”用 ?:
$a = $a + 1,用 += 和 ++,但分清前后置复合赋值(+=、-=、.= 等)简洁安全,推荐使用。自增/自减要注意:
$i++(后置):先返回当前值,再加 1;++$i(前置):先加 1,再返回新值echo $i++; 和 echo ++$i; 输出不同,循环中多数情况用 $i++ 即可,无需强行前置.= 是字符串拼接专用,比 $s = $s . 'abc' 效率高且可读性好像 &、|、^、、>> 这些,在普通业务逻辑里极少出现。但一旦接触用户权限(如 RBAC 中用整数位表示多个权限)、文件系统操作(chmod 参数)、或底层数据处理,就必须懂:
$flags & FLAG_READ 判断是否含读权限(按位与)$flags |= FLAG_WRITE 增加写权限(按位或赋值)gmp 扩展处理大位运算真正容易被忽略的是:运算符优先级比你想的更低,& 甚至低于 ==,所以 $a & $b == $c 实际等价于 $a & ($b == $c) —— 必须加括号:($a & $b) == $c。