php引用赋值用什么符号_php引用赋值&操作符【引用】

1次阅读

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

php引用赋值用什么符号_php引用赋值&操作符【引用】

PHP 里怎么写引用赋值

& 符号,但只在变量声明或赋值时加,不是所有地方都能加。

比如 $b = &$a; 表示 $b 是 $a 的引用,后续改 $b 就等于改 $a;而 $b = &foo(); 只有函数明确声明返回引用才合法,否则会报 Strict Standards: Only variables should be assigned by reference

  • 只能对变量、函数返回引用、new 表达式(PHP 5.0+)做引用赋值
  • echoisset()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 引擎要维护引用计数和符号表映射,调试时变量关系更难追踪。

  • 小变量(intbool、短字符串)几乎没差别,别为了“省一点”滥用引用
  • unset 一个引用变量,不会销毁原值,只有所有引用都被 unset 后,值才真正释放
  • 序列化(serialize())时,引用关系会被展开为独立副本,不保留引用语义

最容易被忽略的坑:引用 + 函数返回值

很多人以为 return &$x; 就能安全返回引用,但前提是 $x 必须是函数外可访问的变量(如全局、静态变量或类属性),局部变量返回引用会导致 Notice: undefined variable 或静默失效。

  • 错误示例:function &get() { $tmp = 123; return &$tmp; } —— $tmp 函数退出就销毁,引用悬空
  • 正确做法:返回类属性 return &$this->data;,或静态变量 Static $cache; return &$cache;
  • 判断函数是否真返回引用:用 refcountis_ref 查看(需 xdebug 或 debug_zval_dump()),不能只看有没有 &

引用不是快捷方式,是共享内存地址的契约。写的时候少想“怎么省事”,多想“谁还在用这个变量”。

text=ZqhQzanResources