请问以下代码中的"&"是什么意思:
class TEST {
}
$abc =& new TEST();
我知道它是通过引用实现的。但是有人能说明一下为什么以及何时需要这样做吗?或者指点我一个解释得很好的网址。我无法理解这个概念。
非常感谢。
据我所知,您询问的不是关于PHP引用的一般性问题,而是关于$foo =& new Bar();
构造习语的问题。
这种构造习语只存在于PHP4中,通常的$foo = new Bar()
将存储对象的一个副本。这通常不会被注意到,除非类在构造函数中存储了对$this的引用。当稍后对返回的对象调用方法时,会存在两个不同的对象副本,而意图可能只是要一个副本。
考虑以下代码,其中构造函数将对$this的引用存储在全局变量中:
class Bar {
function Bar(){
$GLOBALS['copy']=&$this;
$this->str="hello";
}
}
//store copy of constructed object
$x=new Bar;
$x->str="goodbye";
echo $copy->str."\n"; //hello
echo $x->str."\n"; //goodbye
//store reference to constructed object
$x=&new Bar;
$x->str="au revoir";
echo $copy->str."\n"; //au revoir
echo $x->str."\n"; //au revoir
在第一个例子中,$x 和 $copy 引用了不同的 Foo 实例,但在第二个例子中它们是相同的。PHP手册做了相当不错的解释关于引用(references)。
需要注意的是,它们与指针或其他许多语言中的引用(reference)不是同一件事情,尽管存在相似之处。至于默认情况下对象被“按引用传递”的说法——这也不完全正确。
我建议首先阅读手册部分(并可能会反复阅读几次,直到理解为止),然后如果仍有更多问题,请再回到这里。
zval *
。$a = $b
,那么将创建一个指向符号表条目中 $b
所指向的值的副本,并将指向此新值的指针放置在 $a
的符号表条目中。现在,$a
和 $b
将指向不同的值。PHP 将此用作其默认调用约定。$a =& $b
,则$a
的符号表条目将设置为包含在$b
符号表条目中的指针。这意味着$a
和$b
现在指向相同的值 - 直到程序员重新绑定它们之前,它们都是彼此的别名。还要注意$a
实际上并不是对$b
的引用 - 它们都是指向同一对象的指针。PHP5对象仍然与此描述一致 - 它们不是按引用传递,而是传递一个指向对象的指针(手册称其为“对象标识符” - 它可能没有实际实现为C指针 - 我没有检查这个)通过值传递(意味着在分配时复制如上所述)。
请查阅手册以获取有关PHP5对象和引用之间关系的详细信息。
$a = 'foo';
$b = 'bar';
$a =& $b;
$b = 'foobar';
echo $a . ' ' . $b;
将输出
foobar foobar