Ответ
Магический метод __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'