Выбор ответа Middle ООП, трейты и интерфейсы обновлено

Поверхностное клонирование

Вопрос

Объект Order содержит свойство $customer с объектом Customer. Что произойдёт при $copy = clone $order; $copy->customer->name = "Новое";?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Имя изменится и у исходного: копия поверхностная, Customer общий. clone создаёт новый объект и копирует значения свойств.

Варианты ответа

  1. Изменится только копия: clone копирует вложенные объекты рекурсивно
  2. Имя изменится и у исходного: копия поверхностная, Customer общийправильный ответ
  3. Будет ошибка: вложенные объекты нельзя менять после клонирования
  4. Изменится только исходный заказ, а копия сохранит старое имя

Разбор

clone создаёт новый объект и копирует значения свойств. Для свойства-объекта копируется дескриптор, поэтому вложенный Customer общий. Для глубокой копии реализуют __clone() и клонируют вложенные объекты вручную: $this->customer = clone $this->customer;.

Ответьте сами, а не прочитайте

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