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 が指されたのと同じ場所を指します。もちろん、その場所は null です。$foo が再割り当てされると、変更されるのは ZVal $foo が指している場所だけです。最初に $foo に別の値を割り当てた場合でも、$bar はその値を保持します。

私は C でプログラミングすることを学びました。PHP は異なり、参照としてメモリ位置の代わりに ZVals を使用することを理解しています。しかし、このコードを実行すると:

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

2 つの ZVal があるように私には思えます。C では、2 つのメモリ ロケーションが存在します (値は反対のメモリ ロケーションになります)。

誰か説明できますか?

4

1 に答える 1

7

ほとんどの場合、シンボル テーブルがどのように機能するかが問題になります。2 つの面があるテーブルです。

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'
于 2012-12-18T17:01:53.310 に答える