PHP通过引用取消设置

PHP通过引用取消设置,php,pointers,reference,garbage-collection,unset,Php,Pointers,Reference,Garbage Collection,Unset,我一直在阅读关于引用的PHP手册,有些东西让我感到困惑。它说引用不是指向内存地址的指针,而是 相反,它们是符号表 别名 如果引用指向符号表条目,而符号表条目又指向内存地址,那么这本质上不是一个指针吗 编辑: 一些很棒的答案。只是想把这个放在这里。。。如何取消设置另一个指向的变量 $var = "text"; $ref =& $var; unset($ref); 看起来要让它工作,我还需要取消设置$var,以便GC将其删除。关键是,您不能像在其他一些语言中那样对“指针”执行算术操作,例如

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

相反,它们是符号表 别名

如果引用指向符号表条目,而符号表条目又指向内存地址,那么这本质上不是一个指针吗

编辑:

一些很棒的答案。只是想把这个放在这里。。。如何取消设置另一个指向的变量

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

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

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

有一种奇妙的方法,它应该比PHP文档本身(gasp)更深入地解释一切,甚至可以解释变量创建时发生的事情

PHP在内部实现变量 通过称为 _zval_结构,通常简称为zval。除了 存储价值和信息 关于它的类型,zval也 指定引用计数。refcount 统计对对象的引用数 价值观和价值观对于 垃圾收集器的操作, 允许在运行时释放内存 不再使用

PHP中的引用只是一个 对应于相同变量的变量 zval作为另一个变量。工具书类 可以使用 作业的特殊形式 在等号后面加一个和 签字


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

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

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

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

因为链接很好而被接受。所有精彩的答案!谢谢:)