Welcome to php club

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

Краткое описание

PHP4 не имел никой возможности указать другой способ копирования объектов, кроме как стандартный: точная бит в бит копия всех свойств объекта.
Как может показаться на первый взгляд, точная копия не всегда то, что мы хотим. Примеров, где такое поведение не является правильным можно найти много. Например, объект представляющий GTK окно или объект, представляющий соединение с БД, или объекты, в которых свойство является объектом, или объекты, представляющие связанные списки, деревья и т.п.
В PHP5 копия объекта делается с помощью ключевого слова clone. Когда делается копия объекта, PHP5 проверяет наличие метода __clone() и если он не определен, то будет сделана обычная копия объекта. Если же данный метод определен, то он будет вызван на копии после того, как скопируются все свойства оригинала. Прямой вызов __clone() недопустим и приводит к Fatal error.
Пример:

<?php
class MyCloneable {
    static
$id = 0;

    function
MyCloneable() {
        
$this->id = self::$id++;
    }

    function
__clone() {
        
$this->address = 'New York';
        
$this->id = self::$id++;
    }
}

$o = new MyCloneable();

$o->name = 'Hello';
$o->address = 'Tel-Aviv';

echo
$o->id . "\n";

//$o = $o->__clone(); // Fatal error: Cannot call __clone() method on objects - use 'clone $obj' instead
$o = clone $o;

echo
$o->id . "\n";
echo
$o->name . "\n";
echo
$o->address . "\n";
?>

Результат:

Проблемы с обратной совместимостью

Старый код без пользовательских функций, методов или классов с именем clone и с классами без метода __clone() должен работать без изменений.

Дополнительные сведения

Описание в оригинальной документации: http://www.php.net/oop5.cloning


 
Комментариев нет. [Показать комментарии/форму]