4

我在读这个: 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 中会有两个内存位置(并且值将位于相反的内存位置)。

有人可以解释吗?

4

1 回答 1

7

它主要归结为符号表的工作方式。这是一张有两个面的桌子:

symbol name  |  value
-------------+-------
             |

有趣的是,一个值可以分配多个名称:

symbol name  |  value
-------------+-------
foo, bar     | 'baz'

使用 分配给符号时=,表格的value一侧会更改:

$baz = 42;

symbol name  |  value
-------------+-------
baz          | 42

分配 using 时=&,将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'
于 2012-12-18T17:01:53.310 回答