Почему я не могу присвоить $ this по значению, оно, по-видимому, всегда присваивается по ссылке?

#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.