Клонирование объектов в PHP | clone

Данная статья будет про клонирование объектов в php. Сразу приведу пример правильного кода для клонирования объектов в PHP:

<?
class User {
 public $name;

 public function __construct($name) {
  $this->name = $name;
 }
}
$user = new User("Иван");
$user2 = clone $user;
?>

В этом коде, ключевое слово это clone.

Теперь более подробное объяснение.

Клонирование объектов в PHP:

Часто  нам нужно сделать копию (либо клонировать) переменную либо объекта.

Когда дела идёт с переменами всё чуть проще:

$firstVar = 123;
$lastVar = $firstVar; // теперь в ней тоже будет значение 123

(пример что выше может работать даже с объектами но в PHP версий 4)

Теперь неудачный пример копирования объектов:

<?
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

Вот пример использования:

<?
class User {
 public $name;

 public function __construct($name) {
  $this->name = $name;
 }

 public function __clone() {
  echo "Клон сработал!";
 }
}

$user = new User("Иван");

$user2 = clone $user; // Вывод: Клон сработал! ( потому что сработал метод __clone)
?>

Ещё кому-то может быть полезно знать как запретить клонирование, для этого нам просто нужно ставить спецификатор доступа private возле метода __clone.

<?
class User {
 private function __clone() {
  echo "Клон сработал!";
 }
}

$user = new User;

$user2 = clone $user; // тут будет остановлен скрипт и будет показаться ошибка.
?>

Всем удачи 😉

Valeriu :