Что такое магический метод __clone в PHP?

«Что такое магический метод __clone в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Магический метод __clone() в PHP вызывается автоматически при клонировании объекта с помощью оператора clone. Его основное назначение — управление процессом клонирования, особенно для реализации глубокого копирования вложенных объектов, которые по умолчанию копируются по ссылке.

Проблема без __clone():

class Profile {
    public $settings = ['theme' => 'light'];
}

class User {
    public $name;
    public $profile;
    public function __construct($name) {
        $this->name = $name;
        $this->profile = new Profile();
    }
}

$user1 = new User('Alice');
$user2 = clone $user1; // Поверхностное копирование

$user2->profile->settings['theme'] = 'dark';
// Нежелательный побочный эффект:
echo $user1->profile->settings['theme']; // Выведет 'dark' — объекты разделяют один экземпляр Profile

Решение с __clone():

class User {
    public $name;
    public $profile;
    public function __construct($name) {
        $this->name = $name;
        $this->profile = new Profile();
    }
    // Вызывается при clone $user
    public function __clone() {
        // Клонируем вложенный объект, создавая его независимую копию
        $this->profile = clone $this->profile;
        // Можно также сбросить или изменить другие уникальные свойства
        $this->id = null;
    }
}

$user1 = new User('Alice');
$user2 = clone $user1;
$user2->profile->settings['theme'] = 'dark';

// Теперь объекты независимы:
echo $user1->profile->settings['theme']; // 'light'
echo $user2->profile->settings['theme']; // 'dark'