2010-01-13 76 views
0

我一直在阅读有关引用的PHP手册,有些事情让我感到困惑。它表示引用不是指向内存地址的指针,而是指向内存地址,而是...通过引用未设置PHP

而是它们是符号表 别名。

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

编辑:

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

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

看起来这个工作,我需要取消$var以及使GC删除。

回答

1

有一个很棒的PHP References Tutorial它应该比PHP文档本身更深入地解释所有的东西,甚至可以解释变量创建时会发生什么。

PHP内部通过一个结构实现可变 值知道作为 _zval_struct,通常简称为一个的zval。除了存储关于其类型的值和信息 的 之外,zval还指定了一个refcount。引用计数 计算对 值的引用次数,对于垃圾收集器的操作 而言是必不可少的, 允许在不再使用 时释放内存。

PHP中的引用仅仅是一个 变量,对应于与另一个变量相同的 zval。参考文献 可以明确创建使用 特殊形式的分配操作 与等号 符号后的符号。

+0

由于有很好的链接而被接受。尽管所有的辉煌答案!谢谢 :) – Louis 2010-01-14 01:58:01

5

关键是你不能像其他语言那样对“指针”进行任意操作,例如C.在其他语言中,你可以做类似“pointer ++”的操作,从而向前迈进一步在记忆中。这在PHP中是不可能的。

+2

更多详细信息:http://us.php.net/manual/en/language.references.arent.php – 2010-01-14 00:03:25

4

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

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

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

0

PHP global or $GLOBALS

从@Artefacto: “里面一个功能,如果你想取消设置一个全局变量,你必须使用未设置($ GLOBALS [ 'varname的']),而不是全球$ varname的;未设置($ VARNAME);”。