|
|
 |
在构造函数中创建引用可能会导致混淆的结果。本节以教程形式帮助避免问题。
下面来检查一下用拷贝运算符
=
创建的
$bar1
和用引用运算符
=&
创建的
$bar2
有没有区别...
显然没有区别,但实际上有一个非常重要的区别:$bar1
和 $globalref[0]
并没有被引用,它们不是同一个变量。这是因为“new”默认并不返回引用,而返回一个拷贝。
注:
在返回拷贝而不是引用中并没有性能上的损失(因为
PHP 4 及以上版本使用了引用计数)。相反更多情况下工作于拷贝而不是引用上更好,因为建立引用需要一些时间而建立拷贝实际上不花时间(除非它们都不是大的数组或对象,而其中之一跟着另一个变,那使用引用来同时修改它们会更聪明一些)。
要证明以上写的,看看下面的代码。
最后给出另一个例子,试着理解它。
rpav at NOSPAMusers dot sf dot net
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
| |