【问题标题】:PHP Unset via References通过引用取消设置 PHP
【发布时间】:2011-01-04 21:33:33
【问题描述】:

我一直在阅读有关引用的 PHP 手册,但有些事情让我感到困惑。它说引用不是指向内存地址的指针,而是...

相反,它们是符号表 别名。

如果引用指向符号表条目然后指向内存地址,这本质上不是一个指针吗?

编辑:

一些很好的答案。只想在这里弹出这个...我如何取消设置另一个指向的变量?

$var = "text";
$ref =& $var;
unset($ref);

看起来这可以工作,我还需要取消设置 $var 以便 GC 将其删除。

【问题讨论】:

    标签: php pointers reference garbage-collection unset


    【解决方案1】:

    关键是您不能像在其他一些语言(例如 C)中那样对“指针”进行算法操作。在其他语言中,您可以执行“指针++”之类的操作,从而向前迈出一步记忆。这在 PHP 中是不可能的。

    【讨论】:

      【解决方案2】:

      无法通过引用取消设置变量,因为 unset() 实际上删除了引用,而不是值。然后垃圾收集器会清理所有没有任何引用的变量,包括原始变量名。

      这是一件好事。想象两个对象在私有变量中持有对第三个对象的引用。如果一个对象取消设置它的私有变量,另一个对象将不受影响。

      如果您可以通过引用取消设置,则会违反公共/私有模型。

      【讨论】:

        【解决方案3】:

        有一个很棒的PHP References Tutorial,它应该比 PHP 文档本身更深入地解释一切(gasp),甚至可以解释创建变量时会发生什么。

        PHP 内部实现变量 通过称为 a 的结构的值 _zval_struct,一般简称为zval。此外 存储价值和信息 关于它的类型,zval 也 指定一个引用计数。引用计数 计算引用的次数 价值,是必不可少的 垃圾收集器的操作, 允许释放内存 不再使用。

        PHP 中的引用只是一个 对应的变量 zval 作为另一个变量。参考 可以使用显式创建 特殊形式的赋值操作 等号后面有一个 & 号 签名。

        【讨论】:

        • 由于链接很棒而被接受。不过,所有精彩的答案!谢谢:)
        【解决方案4】:

        PHP global or $GLOBALS

        来自@Artefacto: “在函数内部,如果要取消设置全局变量,必须使用 unset($GLOBALS['varname']),而不是全局 $varname; unset($varname);。”

        【讨论】:

          猜你喜欢
          • 2011-10-03
          • 2011-04-09
          • 2019-09-02
          • 2016-01-23
          • 1970-01-01
          • 2015-06-10
          • 2014-01-18
          • 2020-02-28
          • 2011-04-24
          相关资源
          最近更新 更多