我一直在阅读有关参考的 PHP 手册,有些事情让我感到困惑。它说引用不是指向内存地址的指针,而是......
相反,它们是符号表别名。
如果引用指向然后指向内存地址的符号表条目,这本质上不是一个指针吗?
编辑:
一些很棒的答案。只是想在这里弹出这个......我如何取消设置另一个指向的变量?
$var = "text";
$ref =& $var;
unset($ref);
看起来这可以工作,我也需要取消设置$var
,以便 GC 将其删除。
我一直在阅读有关参考的 PHP 手册,有些事情让我感到困惑。它说引用不是指向内存地址的指针,而是......
相反,它们是符号表别名。
如果引用指向然后指向内存地址的符号表条目,这本质上不是一个指针吗?
编辑:
一些很棒的答案。只是想在这里弹出这个......我如何取消设置另一个指向的变量?
$var = "text";
$ref =& $var;
unset($ref);
看起来这可以工作,我也需要取消设置$var
,以便 GC 将其删除。
关键是您不能像在其他一些语言(例如 C)中那样对“指针”进行算法操作。在其他语言中,您可以执行“指针++”之类的操作,从而在内存中前进一步。这在 PHP 中是不可能的。
无法通过引用取消设置变量,因为 unset() 实际上删除了引用,而不是值。然后垃圾收集器会清理所有没有任何引用的变量,包括原始变量名。
这是一件好事。想象两个对象在私有变量中持有对第三个对象的引用。如果一个对象取消设置它的私有变量,另一个对象将不受影响。
如果您可以通过引用取消设置,它将违反公共/私有模型。
有一个精彩的PHP 参考教程,它应该比 PHP 文档本身 ( gasp )更深入地解释所有内容,甚至解释变量创建时会发生什么。
PHP 在内部通过称为 _zval_struct 的结构实现变量值,通常简称为 zval。除了存储值和有关其类型的信息外,zval 还指定了一个 refcount。refcount 计算对该值的引用次数,并且对于垃圾收集器的操作至关重要,允许在不再使用时释放内存。
PHP 中的引用只是一个变量,对应于与另一个变量相同的 zval。可以使用特殊形式的赋值显式创建引用,并在等号后使用 & 符号。
来自@Artefacto:“在函数内部,如果要取消设置全局变量,则必须使用 unset($GLOBALS['varname']),而不是全局 $varname; unset($varname);。”