echo 'test';
class createdclass {
public $name;
}
class testc {
function &testm(){
$myvar =& new createdclass();
return $myvar;
}
}
$testo = new testc();
$a =& $testo->testm();
$a->name = 'Douglas';
$b =& $testo->testm();
$b->name = 'Scott';
echo $a->name;
echo $b->name;
myvar是对象的引用
a和b是对同一对象的引用
我换了一个,然后我换了b,但是没有被b改变
为什么呢?
答案 0 :(得分:4)
在您的代码中,每次调用testm()
都会创建一个新的createdclass实例。所以$ a和$ b不是同一个对象。
答案 1 :(得分:1)
好的,首先,你不应该使用$myvar =& new ...
。这是一个deprecated syntax 并且完全没必要(因为没有什么可以参考)......
其次,您不需要=&
行中的$a =& $testo->testm()
运算符。该方法返回引用的事实足够好。更不用说默认情况下对象通过引用传递,所以你真的不需要需要这些行。我将它们放在方法签名function &foo()
中主要是为了提高可读性(以表明我们期望返回作为参考)...
第三,问题就是你所引用的问题。引用绑定到变量。当您离开范围时,由于$myvar
是一个局部变量(并且因此被垃圾收集 - 它被删除 - 当方法退出时),绑定引用消失。因此,如果您希望这样做,您需要保留该变量。
以下是一个有效的例子:
class testc {
protected $createdclass = null;
public function __construct() {
$this->createdclass = new CreatedClass();
}
public function &testm() {
return $this->createdclass;
}
}
$tester = new testc;
$a = $tester->testm();
$a->name = 'foo';
$b = $tester->testm();
echo $b->name; //displays "foo"...
答案 2 :(得分:1)
在您的示例中,a和b不引用同一个对象,因为您在testm()
函数中创建了一个新对象。
这是一个简短的例子,可能会澄清一点:
<?php
class createdclass {
public $name;
}
$a = new createdclass();
$a->name = 'Douglas';
// make $b reference the same as $a, i.e. let $p point to the same content as $a
$b = &$a;
$b = new createdclass();
$b->name = 'Scott';
echo $a->name;
echo $b->name;
?>
这将输出ScottScott
如果你想了解更多关于php中的引用,我建议你阅读php手册中的References Explained