构造函数中的引用
在构造函数中创建引用可能会导致混淆的结果。本节以教程形式帮助避免问题。
<?php
|
下面来检查一下用拷贝运算符 = 创建的 $bar1 和用引用运算符 =& 创建的 $bar2 有没有区别...
<?php
|
显然没有区别,但实际上有一个非常重要的区别:$bar1 和 $globalref[0] 并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝。
注: 在返回拷贝而不是引用中并没有性能上的损失(因为 PHP 4 及以上版本使用了引用计数)。相反更多情况下工作于拷贝而不是引用上更好,因为建立引用需要一些时间而建立拷贝实际上不花时间(除非它们都不是大的数组或对象,而其中之一跟着另一个变,那使用引用来同时修改它们会更聪明一些)。
<?php
|
最后给出另一个例子,试着理解它。
<?php
|
rpav at NOSPAMusers dot sf dot net
14-Aug-2002 06:13
14-Aug-2002 06:13
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ah HA! I just found an easy workaround with a bit of playing. This works:
--- cut ---
$OBJECTS = array();
class Object {
function &Object() {
global $OBJECTS;
$OBJECTS[] = &$this;
}
function _init() {
}
}
class Derived {
function &Derived() {
Object::Object();
}
}
function blah() {
global $FOO;
$x =& new Derived;
$GLOBALS['FOO'] = &$x;
$x->foo = 42;
display("x", $x);
}
function display($text, &$o) {
echo("($text) =>" . serialize($o));
}
blah();
display("GLOBALS[FOO]", $GLOBALS['FOO']);
display("OBJECTS", $OBJECTS);
--- cut ---
As you can see, simply adding & before the constructor to make it return a reference does the trick. The bit about "returning a copy by default" lead me to try this trick, and it seems to work. Have fun!
-rjp