В следующем коде объясняется проблема, с которой я столкнулся, я пытаюсь назначить $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;
?>
Для объяснения: объект PHP всегда присваивается ссылкой. В java это так, и PHP просто скопировал поведение. Единственный способ скопировать объект - это действительно использовать клон. – Matthieu