php中的变量范围用于引用返回?

时间:2011-12-22 17:21:40

标签: php scope reference

  

变量范围(定义为here

     

变量的范围是定义它的上下文。在大多数情况下,所有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根本没有调用堆栈吗?

1 个答案:

答案 0 :(得分:4)

PHP中的所有变量都是zval*,即C指针。

如果按值返回,PHP在大多数情况下会自动复制zval*并返回该值。如果您通过引用返回,PHP将返回原始zval*。在这些情况下,返回的zval*引用计数都不会达到0。

在C方面,当你返回一个变量时,它会返回一个指向zval的指针,这是一个包含变量信息的C结构(即类型,值,引用计数和{{ 1}}标志)。

由于它是一个指针,它实际上并没有返回一个本地C变量,而是一个预先分配的is_ref指针,它指向实际zval的位置。除非zval引用计数达到0(即:不存储返回值),否则该变量仍将存在,直到程序结束。