2013-03-14 51 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