0

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

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

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

编辑:

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

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

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

4

4 回答 4

5

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

于 2010-01-14T00:02:48.980 回答
4

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

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

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

于 2010-01-14T01:32:25.960 回答
2

有一个精彩的PHP 参考教程,它应该比 PHP 文档本身 ( gasp )更深入地解释所有内容,甚至解释变量创建时会发生什么。

PHP 在内部通过称为 _zval_struct 的结构实现变量值,通常简称为 zval。除了存储值和有关其类型的信息外,zval 还指定了一个 refcount。refcount 计算对该值的引用次数,并且对于垃圾收集器的操作至关重要,允许在不再使用时释放内存。

PHP 中的引用只是一个变量,对应于与另一个变量相同的 zval。可以使用特殊形式的赋值显式创建引用,并在等号后使用 & 符号。

于 2010-01-14T00:02:51.267 回答
0

PHP 全局或 $GLOBALS

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

于 2012-12-14T17:59:48.703 回答