2012-12-18 131 views
4

我在看這個:http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/對ZVals的澄清

有一個例子讓我失望了一下。

$foo = &$bar; 
$bar = &$foo; 
$baz = 'baz'; 

$foo = &$baz; 

var_dump($foo, $bar); 
/* 
string(3) "baz" 
NULL 
*/ 

如果你一直在下面,這可以完美地工作。 $ foo的 被創建,並在由$巴標識的ZVAL指向的位置;當創建 $吧,它指向同一個地方$ foo的指出。這 位置,當然,爲空。當$ foo的重新分配,唯一改變的事情 是其ZVAL $ foo的點;如果我們第一次分配 不同的值$ foo的,那麼$酒吧仍然保留該 值。

我學會了程序C.我的理解是PHP是不同的,它使用的變量容器,而不是存儲位置,如引用。但是,當你運行該代碼:

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

在我看來,那就會有兩個變量容器。在C中會有兩個內存位置(並且這些值將是相反的內存位置)。

有人能解釋一下嗎?

回答

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' 
+1

所以,這是因爲它雖然符號表中的所有作品。當我看到$ a =&$ b時,我應該這樣認爲:「將$ a移動到符號表的同一行,而不是$ b」,「將$ a解析爲$ b」。 – Beachhouse

+0

沒錯。 '=&x'基本上是*「建立一個與x相同的值的引用」,其中「引用」只是簡單地用符號表中的一個條目來完成。 – deceze