通过引用取消设置 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的主要内容,如果未能解决你的问题,请参考以下文章