2011-12-22 23 views
1

變量範圍(如定義herePHP中的變量作爲參考回報?

變量的範圍即它被定義的上下文。大多數情況下,所有PHP變量只有一個範圍。這個單一的範圍跨越了包含和必需的文件。

//a.php 
<?php 
class a { 
function &func() { 
    $avar = array("one", "two", "three"); 
    return $avar; 
} 
?> 

__

//b.php 
<?php 
class b { 
include("a.php"); 
$ainstance = new a; 
var_dump($ainstance->func()); 
} 
?> 

上面的代碼將轉儲關於可變信息作爲預期(我的意思WRT結構爲形成在功能func)。

我的疑問是,

  • 哪裏時,它是在一個函數範圍的變量存儲在哪裏?
  • 如果它在調用堆棧上,那麼在函數終止時不會清理/銷燬該變量?
  • 由於變量沒有被破壞(按照上面的代碼),爲什麼它沒有被破壞,或者PHP有一種機制來保存變量(比如在堆中)並返回引用。
  • PHP有調用堆棧嗎?

回答

4

PHP中的所有變量都是zval*,也就是C指針。

如果按值返回,在大多數情況下,PHP將自動複製zval*並返回該值。如果您通過參考返回,PHP將返回原始的zval*。在沒有這些的情況下才會返回zval*引用計數達到0

在C側,那麼,當返回一個變量,它返回一個指向zval,其是含有約可變信息C結構(即類型,值,refcount和一個is_ref標誌)。

由於它是一個指針,它實際上並不返回本地C變量,而是一個預先分配的zval指針,它指向實際的zval的位置。除非zval* refcount達到0(即:不存儲返回值),否則該變量將一直存在直到程序結束。

+0

雖然我還沒有明白。將通過[zval](http://php.net/manual/en/features.gc.refcounting-basics.php)。 +1指向zval。 – ThinkingMonkey 2011-12-22 17:58:55

+0

你需要知道的是,當返回變量時,PHP會自動返回變量的*副本*,而不像每個例子中的C,您必須自己複製一份副本(例如:返回C字符串時)。 – netcoder 2011-12-22 23:35:38

+0

雅我明白了。再次感謝您指出zval。 – ThinkingMonkey 2011-12-23 05:49:17