#php #class #oop #object #pass-by-reference
#php #класс #ооп #объект #передача по ссылке
Вопрос:
Следующий код объясняет проблему, с которой я сталкиваюсь, я пытаюсь присвоить $this
переменной по значению, но, по-видимому, в конечном итоге она присваивается по ссылке, почему? и как я могу это сделать?
Следующий скрипт представляет собой набор из двух классов Test
и TestQuery
. Test
предполагается значение в $num
атрибуте, затем вызывается скрипт Test->exist()
, который создает две переменные: $original
«по значению» и $obj
по ссылке, на данный момент обе одинаковы. Наконец, предполагается, что вызов скрипта TestQuery->doit( $obj )
; который TestQuery
изменит $code
значение $obj
, если значение $num
равно 2, но результат недействителен, потому что значение $original
и $obj
в exist()
методе снова совпадают.
<?php
class TestQuery{
public function doit( amp;$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 =amp; $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;
?>
Ответ №1:
Решение, которое я нашел, — это использование clone
ключевого слова.
$original = clone $this;
Комментарии:
1. Для пояснения: объект PHP всегда присваивается по ссылке. В java это тоже так, и PHP просто скопировал поведение. Единственный способ скопировать объект — это действительно использовать clone.