我正在读这个:http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/
还有一个让我失望的例子。
$foo = &$bar;
$bar = &$foo;
$baz = 'baz';
$foo = &$baz;
var_dump($foo, $bar);
/*
string(3) "baz"
NULL
*/
如果你一直在追随,这应该是完全合理的。 $ FOO 创建,并指向由$ bar标识的ZVal位置;什么时候 创建了$ bar,它指向$ foo指向的相同位置。那 当然,位置为空。当$ foo被重新分配时,唯一的事情 这种变化是ZVal $ foo指向的;如果我们分配了一个 首先是$ foo的不同值,然后$ bar仍将保留该值 值。
我学会了用C编程。我知道PHP是不同的,它使用ZVals而不是内存位置作为参考。但是当你运行这段代码时:
$foo = &$bar;
$bar = &$foo;
在我看来,会有两个ZVals。在C中,将有两个存储器位置(并且值将是相反的存储器位置)。
有人可以解释一下吗?
答案 0 :(得分:7)
主要归结为符号表的工作原理。这是一张有两面的桌子:
symbol name | value
-------------+-------
|
有趣的是,可以为一个值分配多个名称:
symbol name | value
-------------+-------
foo, bar | 'baz'
使用=
分配符号时,表格的value
面会发生变化:
$baz = 42;
symbol name | value
-------------+-------
baz | 42
使用=&
进行分配时,symbol name
方会移至值为的任何位置:
$foo =& $baz;
symbol name | value
-------------+-------
baz, foo | 42
所以在你的例子中,从头开始:
$foo =& $bar;
($bar does not exist, is null, which is implicitly created,
$foo is pointed to where the implicitly created $bar points)
symbol name | value
-------------+-------
foo, bar | null
$bar = &$foo;
(no real change, $bar is pointed to where $foo is pointing)
symbol name | value
-------------+-------
foo, bar | null
$baz = 'baz';
symbol name | value
-------------+-------
foo, bar | null
baz | 'baz'
$foo = &$baz;
($foo is pointed to where $baz is pointing)
symbol name | value
-------------+-------
bar | null
baz, foo | 'baz'