【问题标题】:Variable scope in php for a reference return?php中的变量范围用于参考返回?
【发布时间】:2011-12-22 17:21:39
【问题描述】:

变量范围(定义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 有调用栈吗?

【问题讨论】:

    标签: php scope reference


    【解决方案1】:

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

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

    在 C 端,嗯,当你返回一个变量时,它返回一个指向 zval 的指针,这是一个 C 结构,包含有关变量的信息(即类型、值、引用计数和 is_ref 标志)。

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

    【讨论】:

    • 虽然没看懂。将通过zval。 +1 指向 zval。
    • 你需要知道的是,当返回变量时,PHP 会自动返回一个变量的copy,不像 C per example,你必须自己制作一个副本(例如:返回 C 字符串时)。
    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多