0
class foo {
    public $value1 = 1;

    public function setValue1(& $v) {
        $this->value1 = $v;
    }
}

class bar {
    public $value2 = 2;
    public $obj;

    public function & getValue2() {
        return $this->value2;
    }

    public function setValue2($v) {
        $this->value2 = $v;
}
}

$foo = new foo();
$bar = new bar();

$bar->obj = $foo;

$foo->setValue1($bar->getValue2()); //<-- not works

//$foo->value1 =& $bar->getValue2(); //<-- works

$bar->setValue2(4);


var_dump($foo, $bar) Prints:
    object(foo)[124]
      public 'value1' => int 2
    object(bar)[123]
      public 'value2' => int 4
      public 'obj' => 
        object(foo)[124]
          public 'value1' => int 2

为什么当我使用 $foo->setValue1($bar->getValue2()) a foo->value1 等于 2 而 bar->value2 等于 4 ?

我正在尝试使用方法而不是属性来传递引用和返回引用。

4

2 回答 2

0

这有效:

class foo {
    public $value1 = 1;

    public function &setValue1( $v ) { // <-- !
        $this->value1 = &$v; // <-- !
    }
}

class bar {
    public $value2 = 2;
    public $obj;

    public function &getValue2() {
        return $this->value2;
    }

    public function &setValue2( $v ) { // <-- !
        $this->value2 = $v;
}
}

$foo = new foo();
$bar = new bar();

$bar->obj = $foo;

$tmp =& $bar->getValue2(); // <-- !
$foo->setValue1( &$tmp ); // <-- !

$bar->setValue2( 4 );

echo "<pre>" . print_r( $foo, 1 ) . "</pre>";
echo "<pre>" . print_r( $bar, 1 ) . "</pre>";

输出:

foo Object
(
    [value1] => 4
)

bar Object
(
    [value2] => 4
    [obj] => foo Object
        (
            [value1] => 4
        )

)
于 2013-03-14T10:14:46.963 回答
0

正确答案是参考方法 $foo->value1 = &$v;

于 2013-03-15T12:55:00.687 回答