对ZVals的澄清

时间:2012-12-18 16:44:25

标签: php

我正在读这个: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中,将有两个存储器位置(并且值将是相反的存储器位置)。

有人可以解释一下吗?

1 个答案:

答案 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'
相关问题