正确断开PHP数组引用的方法是用普通赋值(如$b = $a或$b = [4,5,6]),PHP会自动解除引用并创建新副本;unset($a)仅删除变量名,不解除引用。

PHP 8.1 中,数组引用赋值(如 $b = &$a;)会让 $b 成为 $a 的别名,二者共享同一块内存。此时修改 $b 会直接影响 $a,反之亦然。要真正断开这种引用关系,不能靠 unset() 或重新赋值,而必须让变量脱离对原数组的引用绑定。
✅ 正确断开数组引用的方法
-
方法一:用
=(普通赋值)覆盖引用变量$a = [1, 2, 3]; $b = &$a; // $b 引用 $a $b = [4, 5, 6]; // 此时 $b 不再引用 $a,而是获得新数组副本 echo json_encode($a); // [1,2,3] echo json_encode($b); // [4,5,6]
⚠️ 注意:
$b = [4,5,6]是赋新值,不是“赋新引用”。PHP 会自动解除$b对$a的引用,然后把新数组复制给$b(按值语义)。 -
方法二:显式克隆(适用于嵌套结构或需深拷贝)
立即学习“PHP免费学习笔记(深入)”;
$a = ['x' => [1, 2]]; $b = &$a; $b = $a; // 普通赋值 → 浅拷贝,断开引用 // 或更明确地: $b = [...$a]; // PHP 7.4+ 解构语法(浅拷贝) $b = array_merge([], $a); // 兼容旧版
? 普通赋值默认是浅拷贝。若数组含对象或嵌套引用,需
clone对象或递归复制(如unserialize(serialize($a))),但一般场景下直接= $a就够了。 -
方法三:用
unset()后重新声明(不推荐,仅作理解)$a = [1, 2]; $b = &$a; unset($b); // 只销毁变量 $b,不碰 $a $b = $a; // 再次赋值 → 新的独立副本
这可行但多余,不如直接
$b = $a;一步到位。
❌ 常见误区(不会断开引用)
-
unset($a):只删$a,$b仍有效且继续指向原数组内容; -
$b = null或$b = []:会断开引用 ✅(因为是赋新值),但注意这是重置而非复制原数组; -
$b =& $c(换一个引用):只是把$b指向别处,原$a不受影响,但$b和$a已无关联 —— 这也算“断开”,但通常不是你想要的逻辑。
? 补充:为什么 unset($a) 不影响 $b?
PHP 的引用是“符号表绑定”。$b = &$a 让 $b 和 $a 都指向同一个 zval(变量容器)。unset($a) 只是删掉符号表里 $a 这个别名,zval 本身还在,$b 依然能访问它。这和 Unix 的硬链接类似:删一个链接,文件内容还在。
? 小结操作建议
- 要完全独立两个数组:用
$b = $a;(推荐)、$b = [...$a];或array_values($a); - 要保留原数组、让
$b变成全新数据:直接$b = [新的值];; - 不要用
unset()试图“解绑”——它不解引用,只删变量名; - PHP 8.1 对引用 GC 更积极,但别依赖它来“自动断开”。
这样处理后,两个变量就彻底互不影响了。



















