Метод __clone
Методът __clone се извиква автоматично при използване на оператора clone.
Той позволява дефиниране на собствена логика за копиране на обекта. По подразбиране PHP
извършва плитко копиране на всички свойства на обекта. Методът __clone е полезен,
когато трябва да се реализира дълбоко копиране или да се промени поведението при клониране.
Синтаксис
public function __clone(): void
Пример
Нека реализираме основно клониране на обект:
<?php
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function __clone() {
echo 'Обектът е клониран';
}
}
$user1 = new User('John');
$user2 = clone $user1;
?>
Резултат от изпълнението на кода:
'Обектът е клониран'
Пример
Нека реализираме дълбоко копиране на обект с вложени обекти:
<?php
class Address {
public $city;
public function __construct($city) {
$this->city = $city;
}
}
class User {
public $name;
public $address;
public function __construct($name, $city) {
$this->name = $name;
$this->address = new Address($city);
}
public function __clone() {
$this->address = clone $this->address;
}
}
$user1 = new User('John', 'New York');
$user2 = clone $user1;
$user2->address->city = 'Boston';
echo $user1->address->city;
?>
Резултат от изпълнението на кода:
'New York'
Пример
Нека добавим уникален идентификатор при клониране:
<?php
class Product {
public $id;
public $name;
public function __construct($name) {
$this->id = uniqid();
$this->name = $name;
}
public function __clone() {
$this->id = uniqid();
}
}
$product1 = new Product('Laptop');
$product2 = clone $product1;
echo $product1->id . ' ' . $product2->id;
?>
Резултат от изпълнението на кода (пример):
'5f1a2b3c 5f1a2b3d'
Вижте също
-
метод
__construct,
който е конструктор на обект