2013-03-14 48 views
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())时,foo-> value1等于2,bar-> value2等于4?如何在两种方法中通过引用传递?

我想通过引用传递和通过引用返回使用方法而不是属性。

+3

请阅读[PHP手册返回引用](http://php.net/manual/en/language.references.return.php),它声明“注意:不像参数传递,在这里你必须使用&在这两个地方 - 表明您希望通过引用而不是副本返回,并指出应该为$ myValue完成引用绑定,而不是通常的赋值。“尝试行'$ foo-> setValue1(&$ bar-> getValue2());' – Jon 2013-03-14 09:56:12

+0

您需要使用方法内的引用$ this-> value1 = &$v; – sectus 2013-03-14 10:07:02

+0

yes!这是正确的答案,谢谢 – 2013-03-14 10:34:01

回答

0

正确答案为$方法foo->值1 =内部参考& $ V;

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 
     ) 

) 
+0

BIT CHEETAH,@Jon,请在这里阅读注意:http://www.php.net/manual/en/language.references.pass.php – sectus 2013-03-14 10:30:39

+0

$ foo-> setValue1(&$ tmp); // < - ! //致命错误:调用时传递引用已被删除 – 2013-03-14 10:32:18