Object Cloning

Оновлено: 11.05.2023

Створення копії об'єкта з повністю відтвореними властивостями не завжди є бажаною поведінкою. Хорошим прикладом потреби у конструкторах копіювання є створення об'єкта, який представляє вікно GTK, і об'єкт зберігає ресурси цього вікна GTK, коли ви створюєте копію, ви можете захотіти створити нове вікно з тими самими властивостями, і новий об'єкт повинен зберігати ресурси нового вікна. Іншим прикладом є випадок, коли ваш об'єкт містить посилання на інший об'єкт, який він використовує, і коли ви копіюєте батьківський об'єкт, ви хочете створити новий екземпляр цього іншого об'єкта, щоб копія мала свою власну окрему копію.

Копія об'єкта створюється за допомогою ключового слова clone (яке викликає метод __clone() об'єкта, якщо це можливо).

Коли об'єкт клонується, PHP виконує поверхневе копіювання всіх властивостей об'єкта. Будь-які властивості, які є посиланнями на інші змінні, залишаться посиланнями.

Після завершення клонування, якщо визначено метод __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);

?>

Можна отримати доступ до члена щойно клонованого об'єкта за допомогою одного виразу:

Приклад #2 Доступ до члена доступу до щойно клонованого об'єкту

<?php
$dateTime = new DateTime();
echo (clone $dateTime)->format('Y');
?>