php引用赋值用&仅限变量、引用返回函数或new表达式;函数参数必须定义时加&,调用时不加;foreach需写as &$v并unset($v);对象默认引用无需&;局部变量不能返回引用。

PHP 里怎么写引用赋值
用 & 符号,但只在变量声明或赋值时加,不是所有地方都能加。
比如 $b = &$a; 表示 $b 是 $a 的引用,后续改 $b 就等于改 $a;而 $b = &foo(); 只有函数明确声明返回引用才合法,否则会报 Strict Standards: Only variables should be assigned by reference。
- 只能对变量、函数返回引用、
new表达式(PHP 5.0+)做引用赋值 -
echo、isset()、empty()这类语言结构不能接& - 数组元素支持引用:
$arr[0] = &$x;,但$arr[] = &$x;在 PHP 7.4+ 才安全(之前可能意外解引用)
为什么 &$var 有时不生效
常见于函数参数传递或 foreach 循环——你以为传了引用,其实没传成。
函数定义必须显式写 &$param,调用时 & 写在调用侧是无效甚至报错的。例如:
立即学习“PHP免费学习笔记(深入)”;
function modify(&$x) { $x++; }
$a = 1;
modify($a); // ✅ 正确:函数声明带 &,调用不加 &
modify(&$a); // ❌ PHP 8.0+ 报 Warning,PHP 7.x 可能静默忽略
- foreach 中想修改原数组,得写
foreach ($arr as &$v),结束后记得unset($v),否则 $v 会继续引用最后一个元素,下次循环可能污染数据 - 对象默认就是“类引用”行为(实际是对象标识符引用),不需要
&;加了反而容易混淆,且 PHP 7.4+ 对&$obj有严格警告
引用和普通赋值在内存/性能上差多少
引用本身不复制值,所以大字符串、大数组赋值时省内存也快;但代价是 PHP 引擎要维护引用计数和符号表映射,调试时变量关系更难追踪。
- 小变量(int、bool、短字符串)几乎没差别,别为了“省一点”滥用引用
- unset 一个引用变量,不会销毁原值,只有所有引用都被 unset 后,值才真正释放
- 序列化(
serialize())时,引用关系会被展开为独立副本,不保留引用语义
最容易被忽略的坑:引用 + 函数返回值
很多人以为 return &$x; 就能安全返回引用,但前提是 $x 必须是函数外可访问的变量(如全局、静态变量或类属性),局部变量返回引用会导致 Notice: Undefined variable 或静默失效。
- 错误示例:
function &get() { $tmp = 123; return &$tmp; }——$tmp函数退出就销毁,引用悬空 - 正确做法:返回类属性
return &$this->data;,或静态变量static $cache; return &$cache; - 判断函数是否真返回引用:用
refcount和is_ref查看(需 xdebug 或debug_zval_dump()),不能只看有没有&
引用不是快捷方式,是共享内存地址的契约。写的时候少想“怎么省事”,多想“谁还在用这个变量”。










