【问题标题】:Clarification on ZVals关于 ZVals 的说明
【发布时间】:2012-12-18 16:44:24
【问题描述】:

我在读这个: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
*/

如果您一直在关注,这应该很有意义。 $富 被创建,并指向由 $bar 标识的 ZVal 位置;什么时候 $bar 被创建,它指向 $foo 被指向的同一个地方。那 当然,位置是空的。当 $foo 被重新分配时,唯一的 变化是 ZVal $foo 指向的;如果我们分配了一个 首先与 $foo 不同的值,然后 $bar 仍然会保留它 价值。

我学会了用 C 编程。我知道 PHP 是不同的,它使用 ZVals 而不是内存位置作为引用。但是当你运行这段代码时:

$foo = &$bar;
$bar = &$foo;

在我看来会有两个 ZVals。在 C 中会有两个内存位置(并且值将位于相反的内存位置)。

谁能解释一下?

【问题讨论】:

    标签: php


    【解决方案1】:

    这主要取决于 符号表 的工作方式。这是一张有两个面的桌子:

    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'
    

    【讨论】:

    • 所以这是因为它通过符号表工作。当我看到 $a =& $b 时,我应该想,“将 $a 移动到与 $b 相同的符号表行”而不是“将 $a 解析为 $b”。
    • 对。 =& x 基本上是“建立对与 x 相同的值的引用”,其中“引用”只是通过符号表中的条目完成。
    猜你喜欢
    • 2019-08-29
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    • 1970-01-01
    相关资源
    最近更新 更多