
PHP 赋值运算符不是只有 =
很多人写 $a = $b 就以为搞定了赋值,其实 PHP 里有 11 种赋值运算符,真正常用的是 =、+=、-=、.= 这几个。其他像 &=、^= 多数人一辈子都用不上,除非在位操作或加密库源码里碰见。
关键区别在于:带运算的赋值(如 +=)会先读取左操作数的当前值,再执行运算,最后赋回——这和 $a = $a + $b 表面等价,但底层行为一致,**不是语法糖而已**。
-
$a += $b等价于$a = $a + $b,但更简洁、可读性更强 -
$str .= "world"是字符串拼接唯一推荐写法;用$str = $str . "world"会多一次字符串拷贝,小数据不明显,循环里性能差一截 -
$arr[] = $val是数组追加的惯用写法,它本质是赋值运算符的一种特例(隐式索引赋值),不是算术运算符
引用赋值 =& 容易误当成“深拷贝”
=& 不是复制值,而是让两个变量指向同一块内存。改其中一个,另一个立刻变——这点在函数传参、对象操作、循环中特别容易踩坑。
- 对象默认就是引用语义(PHP 5.0+),
$obj2 = $obj1已经是“类似引用”,再加=&没意义,还可能触发严格警告 - 对数组或标量用
=&后,unset($a)不会影响$b,但$a = null会让$b也变成null - 函数返回引用时必须显式声明:
function &getRef() { return $GLOBALS['x']; },否则$a =& getRef()会报Strict Standards
复合赋值运算符的类型隐式转换很危险
PHP 在做 +=、-= 时会尝试把右操作数转成左操作数的类型,但规则不直观。比如整数数组键名被当字符串处理,浮点数精度丢失,空字符串变 0——这些都不是报错,而是静默出错。
立即学习“PHP免费学习笔记(深入)”;
-
$num = "123abc"; $num += 1;→ 结果是124(字符串被截断转为整数) -
$arr = [1 => 'a', 2 => 'b']; $arr += ['0' => 'x'];→'0'键不会被合并,因为'0'是字符串,而数字键0不存在 -
$a = 0.1; $a += 0.2;→ 结果不是0.3,而是0.30000000000000004,浮点误差照常发生
赋值表达式的返回值经常被忽略
PHP 中所有赋值运算符都有返回值,就是右边计算后的结果。这个特性让链式赋值、条件中赋值成为可能,但也埋了坑。
-
if ($a = getValue()) { ... }是合法的,但极易和==混淆;建议用括号强调意图:if (($a = getValue())) { ... } -
$a = $b = $c = 42;是从右往左结合,等价于$a = ($b = ($c = 42)); -
list($a, $b) = explode(',', $str);是结构化赋值,本质是数组解构,不是普通赋值;PHP 7.1+ 支持[$a, $b] = explode(...)
最麻烦的是嵌套赋值加引用混用,比如 $a =& $b = []; $a[] = 1;,这时候 $b 也会变,但很多人以为 = 和 =& 的优先级一样,其实 =& 优先级略低,整个表达式等价于 $a =& ($b = []);——这种细节不查文档根本想不到。











