测试参考

时间:2010-08-21 12:35:16

标签: php

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改变 为什么呢?

3 个答案:

答案 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