Создание копии объекта с полностью реплицированными свойствами не всегда является желаемым поведением. Хорошим примером необходимости конструкторов копирования является то, что если у вас есть объект, который представляет окно GTK, и объект содержит ресурс этого окна GTK, при создании дубликата вы можете захотеть создать новое окно с теми же свойствами и пусть новый объект содержит ресурс нового окна. Другой пример: ваш объект содержит ссылку на другой объект, который он использует, и когда вы реплицируете родительский объект, вы хотите создать новый экземпляр этого другого объекта, чтобы реплика имела свою собственную отдельную копию.
Копия объекта создается с помощью clone
ключевого слова (которое, если возможно, вызывает метод объекта __clone() ).
$copy_of_object = clone $object;
Когда объект клонируется, PHP выполняет поверхностную копию всех свойств объекта. Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.
__clone(): void
После завершения клонирования, если определен метод __clone (), будет вызван метод __clone() вновь созданного объекта , чтобы разрешить любые необходимые свойства, которые необходимо изменить.
Пример #1 Клонирование объекта
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// Force a copy of this->object, otherwise
// it will point to same object.
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?>
Приведенный выше пример выведет:
Исходный объект:
объект MyCloneable
(
[object1] => объект SubObject
(
[instance] => 1
)
[object2] => объект SubObject
(
[instance] => 2
)
)
Клонированный объект:
объект MyCloneable
(
[object1] => объект SubObject
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Можно получить доступ к члену только что клонированного объекта в одном выражении:
Пример #2 Доступ к только что клонированному объекту
<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>
0 комментариев