Данная статья будет про клонирование объектов в php. Сразу приведу пример правильного кода для клонирования объектов в PHP:
1 2 3 4 5 6 7 8 9 10 11 |
<? class User { public $name; public function __construct($name) { $this->name = $name; } } $user = new User("Иван"); $user2 = clone $user; ?> |
В этом коде, ключевое слово это clone.
Теперь более подробное объяснение.
Клонирование объектов в PHP:
Часто нам нужно сделать копию (либо клонировать) переменную либо объекта.
Когда дела идёт с переменами всё чуть проще:
1 2 |
$firstVar = 123; $lastVar = $firstVar; // теперь в ней тоже будет значение 123 |
(пример что выше может работать даже с объектами но в PHP версий 4)
Теперь неудачный пример копирования объектов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<? class User { public $name; public function __construct($name) { $this->name = $name; } } $user = new User("Иван"); echo $user->name; // Вывод: Иван $user2 = $user; $user2->name = "Маша"; echo $user->name; // Вывод: Маша, не смотря на то что слово "Маша" мы поставили в объект $user2 ?> |
Отсюда и вывод, просто копировать объекты как мы это делаем с объектами не получиться, потому что получим ссылку на объект, а не его копию.
Ещё замечание: при клонирование нельзя передавать параметры в __construct;
Если вам нужно сделать какие-то действия при клонирование объекта то в PHP есть метод __clone
Вот пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<? class User { public $name; public function __construct($name) { $this->name = $name; } public function __clone() { echo "Клон сработал!"; } } $user = new User("Иван"); $user2 = clone $user; // Вывод: Клон сработал! ( потому что сработал метод __clone) ?> |
Ещё кому-то может быть полезно знать как запретить клонирование, для этого нам просто нужно ставить спецификатор доступа private возле метода __clone.
1 2 3 4 5 6 7 8 9 10 11 |
<? class User { private function __clone() { echo "Клон сработал!"; } } $user = new User; $user2 = clone $user; // тут будет остановлен скрипт и будет показаться ошибка. ?> |
Всем удачи 😉