假设您使用嵌套的PHP数组创建一个复杂的数据结构,如下所示:
$a1 = array(
'b' => array('foo' => 1),
'c' => array('bar' => 1)
);
Run Code Online (Sandbox Code Playgroud)
想象一下,数组要更加嵌套,具有更多元素和更长,更有意义的名称.
如果需要经常访问$ a1的子结构,对于读写,可能会想要创建这样的"别名":
$b = &$a1['b'];
Run Code Online (Sandbox Code Playgroud)
然而,由于"任务"实际上改变了$ a1,这导致了巨大的混乱.
我认为许多缺乏经验的PHP开发人员(比如我)会认为$ b是在分配后对$ a1 ['b']的引用.真正发生的是$ b AND $ a1 ['b']变成对元素的引用array('foo' => 1),带来意想不到的后果.我发现这非常不直观.
假设您需要保留$ a1,但是您还需要$ a1的副本,让我们调用副本$ a2,并更改$ a2的一些元素:
$a2 = $a1; // Copy $a1 to $a2
$a2['b']['foo'] = 2; // GOTCHA! This will change $a1['b']['foo'] as well!
$a2['c']['bar'] = 2; // This will not change $a1['c']['bar'] however
Run Code Online (Sandbox Code Playgroud)
因为我们之前创建了对$ a1 ['b']的引用,所以该元素将通过引用分配,而$ a1的其余部分按值复制.这花了我几个小时才弄明白. …