2016-10-22 7 views
1

次のコードは、私が持っている問題を説明しています。私は値によって変数に$thisを割り当てようとしていますが、最終的には参照によって割り当てられます。どうしたらいいですか?

次のスクリプトは、2つのクラスTestTestQueryのセットです。 Test$num属性の値をとると、スクリプトはTest->exist()を呼び出し、2つの変数を作成します。$original "値による"と$objの参照で、この時点では両方が同じです。最後に、スクリプトコールTestQuery->doit($obj)を呼び出します。 $numの値が2である場合$original$objの値がexist()の方法で同じであるため、結果は無効です。

<?php 

class TestQuery{ 
    public function doit(&$obj) 
    { 
     if ($obj->getNum() == 2) 
      $obj->setCode(55); 
    } 
} 

class Test { 
    public $code; 
    public $num; 

    public function setCode($code) { $this->code= $code; } 
    public function getCode($code) { return $this->code; } 

    public function getNum() 
    { 
     return $this->num; 
    } 

    public function exist() 
    { 
     $original = $this; 
     $obj =& $this; 

     // The same objects ...(valid) 
     echo "<xmp>"; 
     print_r($original); 
     echo " VS "; 
     print_r($obj); 
     echo "</xmp>"; 

     $tc = new TestQuery(); 
     $tc->doit($obj); 

     // The same objects newly... (invalid, hoping different) 
     echo "<xmp>"; 
     print_r($original); 
     echo " VS "; 
     print_r($obj); 
     echo "</xmp>"; 
    } 

} 

$t = new Test(); 
$t->num = 2; 
$t->exist(); 

exit; 

?> 

答えて

0

私が見つけた解決策は、cloneキーワードの使用です。

$original = clone $this; 
+1

説明のために、オブジェクトは常に参照によって割り当てられます。 Javaの場合も同様です.PHPは動作をコピーしました。 オブジェクトをコピーする唯一の方法は、確かにクローンを使用することです。 – Matthieu

関連する問題