Intereting Posts

Клон не работает для меня?

У меня есть объект $objDummy некоторого класса ClassDummy а другой – как

$objClone = clone $objDummy;

Затем я делаю изменения в $objClone , также изменяется $objClone $objDummy . Я не хочу этого делать. Как я могу заставить это работать?

EDIT: В ответ на Криса. Вот пример

 <?php class myAnotherObject{ public $myAnotherVar =10; } class myObject { public $myVar = false; function __construct() { $this->myVar = new myAnotherObject(); } } $nl = "\n"; //* $nl = '<br />'; //*/ $obj1 = new myObject(); echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar; $obj2 = clone $obj1; echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar; $obj2->myVar->myAnotherVar = 20; echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar; 

Выход

 obj1->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 20, obj2->myVar->myAnotherVar: 20 

Вы реализуете метод __clone() ? Примеры в документации PHP по клонированию объяснят это лучше, чем я могу. В частности, вас интересует эта часть,

Когда объект клонирован, PHP 5 выполняет мелкую копию всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.

После завершения клонирования, если метод __clone () определен, тогда будет вызываться метод __clone () вновь созданного объекта, чтобы разрешить любые необходимые свойства, которые необходимо изменить.

ОБНОВИТЬ
Основываясь на вашем обновлении к вопросу, вам действительно не хватает реализации __clone() . Поскольку член $myVar myObject сам по себе является объектом, вам также нужно клонировать его. Вот как должен выглядеть ваш класс myObject ,

 class myObject { public $myVar = false; function __construct() { $this->myVar = new myAnotherObject(); } function __clone() { $this->myVar = clone $this->myVar; } } 

Затем выход будет следующим:

 obj1->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20 

Я не могу воспроизвести ваши результаты. Используя приведенный ниже код, я получаю ожидаемый результат (скопированный ниже кода). Для этого не требуется метод ___ clone (). Можете ли вы опубликовать сокращенную версию вашего кода?

КОД

 class myObject { public $myVar = false; function __construct($newVar=5) { $this->myVar = $newVar; } } $nl = "\n"; //* $nl = '<br />'; //*/ $obj1 = new myObject(10); echo 'obj1->myVar: '.$obj1->myVar; $obj2 = clone $obj1; echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar; $obj1->myVar = 20; echo $nl.'obj1->myVar: '.$obj1->myVar.', obj2->myVar: '.$obj2->myVar; 

ВЫВОД

 obj1->myVar: 10 obj1->myVar: 10, obj2->myVar: 10 obj1->myVar: 20, obj2->myVar: 10 

Отредактировано после обсуждения:

Ваша проблема вызвана ссылкой на объект. Поскольку все объекты обрабатываются ссылкой, когда вы клонируете объект, вам также нужно клонировать любые внутренние объекты, иначе вы получите ссылку на один объект.

КОД

 class myAnotherObject{ public $myAnotherVar =10; } class myObject { public $myVar = false; function __construct() { $this->myVar = new myAnotherObject(); } function __clone() { $this->myVar = clone $this->myVar; } } $nl = "\n"; //* $nl = '<br />'; //*/ $obj1 = new myObject(); echo 'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar; $obj2 = clone $obj1; echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar; $obj2->myVar->myAnotherVar = 20; echo $nl.'obj1->myVar->myAnotherVar: '.$obj1->myVar->myAnotherVar.', obj2->myVar->myAnotherVar: '.$obj2->myVar->myAnotherVar; 

ВЫВОД

 obj1->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 10 obj1->myVar->myAnotherVar: 10, obj2->myVar->myAnotherVar: 20