Допустим есть класс 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);
?>
Для этой цели можно использовать магический метод __clone и указать принудительно какие свойства нужно скопировать а иначе они будут являться ссылками на один и тот же объект.
Вот например так:
public function __clone()
{
$this->a = clone $this->a;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня следующая задача, есть страница откуда нужно спарсить информацию, проблема состоит в том что информация которую мне нужно добыть,...
Как правильно вывести сумму всех значений на PHP? Имею такой код, но он не хочет работать
Мне нужна функция, чтобы изменить первую букву в слове на э, в случае если оно начинается с е