Создание копии объекта с полностью реплицированными свойствами не всегда является желаемым поведением. Хорошим примером необходимости конструкторов копирования является то, что если у вас есть объект, который представляет окно 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');
?>