通过引用取消设置 PHP

Posted

技术标签:

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

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

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

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

编辑:

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

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

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

【问题讨论】:

【参考方案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);。”

【讨论】:

以上是关于通过引用取消设置 PHP的主要内容,如果未能解决你的问题,请参考以下文章

通过引用取消设置会话不起作用

取消设置 php 参考

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

取消设置 php 会话变量

在ajax中取消设置通过post传递的变量

通过取消引用 NULL 指针来分配引用