php运算符需实践掌握:%截断浮点数取整、/恒返float、==松散比较易致逻辑错误;应优先用fmod、intdiv、===,注意类型转换与优先级陷阱。

PHP运算符不是背出来的,是踩坑踩熟的——你写的代码没报错但结果不对,八成是%截断了浮点数、/悄悄返回了float、或者==把'0'和0当成了同一个东西。
为什么%对浮点数不报错却总算错?
因为%根本不管小数点,它只认整数。传入10.7 % 3.2时,PHP 会先分别把两个操作数截断为10和3,再算10 % 3得1,而不是你预期的余数逻辑。
- 只对整数安全:确保变量类型是
int,可用(int)$x或intval($x)显式转换 - 想对浮点数取余?用
fmod($x, $y),它保留小数精度 - 负数取模注意符号:
-7 % 3结果是-1(被除数符号决定),不是2
/永远返回float,但你可能想要整数
6 / 2的结果是3.0,不是3;is_int(6 / 2)返回false。这不是 bug,是 PHP 的设计选择——除法结果类型统一为float,避免整除截断歧义。
- 要整数商:用
intdiv(6, 2)(PHP 7+),它明确抛出DivisionByZeroError而非返回INF - 要向下取整:用
floor(7 / 2)得3.0,再(int)转;但注意floor(-7 / 2)是-4.0,不是-3 - 除零不崩溃:
5 / 0触发 warning 并返回INF,必须用is_infinite()主动检查
== vs ===:别等线上出问题才想起类型
==会自动做类型转换,比如0 == ''、0 == '0'、false == ''全为true。这在表单验证、数据库查询结果比对时极易引入静默逻辑错误。
- 默认用
===:值和类型都严格匹配,0 === '0'是false - 只有明确需要松散比较时才用
==,例如:$_GET['id'] == $user_id(且你已确认$_GET['id']是数字字符串) -
??只判null或未定义,?:才判“假值”(0、''、false都触发) - 排序比较用
(太空船运算符),它天然防类型转换导致的strcmp陷阱
+=和.=看起来像兄弟,行为却完全不同
$a += $b是数值加法(或数组合并),$s .= $t是字符串拼接。混用会出事:$x = '10'; $x += '5';得15(字符串转int),但$x = 'abc'; $x += 'def';得0(非数字字符串转0)。
-
.=专用于字符串,安全高效,$s .= 'hello'比$s = $s . 'hello'少一次复制 -
+=对数组是“键存在则跳过”的合并:$a = ['a' => 1]; $a += ['a' => 2, 'b' => 3]后$a仍是['a' => 1, 'b' => 3] - 对
null用+=会触发 notice:$x = null; $x += 1;→Notice: A non well formed numeric value encountered
最易被忽略的是运算符优先级隐含的求值顺序——比如$i++ + ++$i在不同 PHP 小版本中结果可能不同,这种表达式应该直接重写为两行。运算符不是语法装饰,是执行契约;写的时候就要想清楚:这个+左边是什么类型?右边有没有副作用?结果要不要参与下一步判断?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











