Клонирование объекта в PHP

145
07 июня 2019, 07:20

Допустим есть класс Alpha и класс Betta. Объект $b класса Betta содержит переменную $a класса Alpha. При клонировании $b:

$c=clone($b);

любые операции с объектом $c->$a будут приводить к изменению $b->$a

Но, если вместо clone использовать

$c=unserialize(serialize($b));

то получится примерно то, что мне нужно ($c->$a и $b->$a - разные объекты).

Мой вопрос: а как правильно делать такое клонирование объекта, когда все переменные внутри нового объекта не связаны с переменными внутри первоначального?

Вот пример кода:

            <?php
                function preprint_r($obj){
                    echo '<pre>';
                    print_r($obj);
                    echo '</pre>';
                }
                class Alpha{
                    var $name = "abc";
                    function __construct($nam){
                        $this->name = $nam;
                    }
                    function change_name($smth){
                        $this->name = $smth;
                    }
                }
                class Betta{
                    var $a;
                    function __construct($nam){
                        $this->a = new Alpha($nam);
                    }
                    //protected //Fatal error: Call to protected method Betta::change_a_name() from context
                    function change_a_name($smth){
                        $this->a->name = $smth;
                    }
                }
                $b = new Betta("zzz");
                //Объект $a внутри $c будет тем же объектом, что и $a внутри $b
                //$c = clone($b);   //
                //Объект $a внутри $c будет отличаться от $a внутри $b
                $c = unserialize(serialize($b));
                preprint_r($b);
                preprint_r($c);
                //$c->a->name = "ccc";
                //$c->a->change_name("xxx");
                $c->change_a_name("eee");
                preprint_r($b);
                preprint_r($c);
            ?>
Answer 1

Для этой цели можно использовать магический метод __clone и указать принудительно какие свойства нужно скопировать а иначе они будут являться ссылками на один и тот же объект.

Вот например так:

public function __clone()
{
    $this->a = clone $this->a;
}
READ ALSO
Почему ошибка в Ocmod Opencart 2.3?

Почему ошибка в Ocmod Opencart 2.3?

часть кода в файле модификатора до изменения

125
Js массив в PHP массив

Js массив в PHP массив

У меня следующая задача, есть страница откуда нужно спарсить информацию, проблема состоит в том что информация которую мне нужно добыть,...

112
Как вывести сумму из MYSQL на PHP

Как вывести сумму из MYSQL на PHP

Как правильно вывести сумму всех значений на PHP? Имею такой код, но он не хочет работать

142
Изменить первую букву в слове

Изменить первую букву в слове

Мне нужна функция, чтобы изменить первую букву в слове на э, в случае если оно начинается с е

123