2011-12-22 82 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