2016-10-22 2 views
1

В следующем коде объясняется проблема, с которой я столкнулся, я пытаюсь назначить $this переменной по значению, но она, по-видимому, окончательно назначается ссылкой, почему? и как я могу это сделать?

Следующий сценарий представляет собой набор из двух классов Test и TestQuery. Test принимает значение в атрибуте $num, тогда сценарий вызывает Test->exist(), который создает две переменные: $original «по значению» и $obj по ссылке, на этом этапе оба они одинаковы. Наконец, вызов скрипта TestQuery->doit($obj); является suposed, что TestQuery изменит $code в $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

Для объяснения: объект PHP всегда присваивается ссылкой. В java это так, и PHP просто скопировал поведение. Единственный способ скопировать объект - это действительно использовать клон. – Matthieu