SobesLab логотип SobesLab

Ответ

По умолчанию при клонировании (через clone) в PHP выполняется поверхностное копирование объекта: копируются все его свойства-скалярные значения, а свойства-объекты при клонировании останутся ссылками на те же самые вложенные объекты (то есть вложенный объект не дублируется, оба объекта-сущности после клонирования ссылаются на один и тот же экземпляр вложенного объекта). В итоге изменения во вложенном объекте будут видны и в оригинале, и в копии. Чтобы реализовать глубокое клонирование, нужно переопределить в классе метод __clone(), внутри которого явно клонировать вложенные объекты (например, $this->child = clone $this->child). Таким образом, при клонировании основного объекта PHP вызовет ваш __clone(), где вы создадите копии всех нужных вложенных объектов, получив полноценную независимую копию всего графа объектов.