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

Клонирование объектов в PHP осуществляется с использованием ключевого слова clone

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

    Копия объекта создается с помощью ключевого слова clone ( который вызывает метод __clone() )
    $copy_of_object = clone $object;
    После завершения клонирования, если метод __clone() определён, то будет вызван метод __clone() вновь созданного объекта для возможного изменения всех необходимых свойств

    class TestClass { static $var1 = 0; public $var2; public function __construct() { echo "<br>Создается объект TestClass<br>"; $this->var2 = ++self::$var1; echo "<br>var1 = $this->var1<br>"; echo "<br>var2 = $this->var2<br>"; } public function __clone() { echo "<br> TestClass::__clone()<br>"; $this->var2 = ++self::$var1; echo "<br>TestClass::__clone():var1 = $this->var1<br>"; echo "<br>TestClass::__clone():var2 = $this->var2<br>"; } } class MyClone { public $obj1; public $obj2; // Принудительно клонируем this->object1, иначе // он будет указывать на один и тот же объект function __clone() { echo "<br>Принудительное клонирование MyClone::__clone()<br>"; $this->obj1 = clone $this->obj1; } } $object1 = new MyClone(); $object1->obj1 = new TestClass(); $object1->obj2 = new TestClass(); echo "<br> Функция __clone() сработает в классе TestClass и в классе MyClone <br>"; $object2 = clone $object1; echo "<br>Оригинальный объект: <br>"; var_dump($object1); echo "<br>Клонированный объект: <br>"; var_dump($object2); #2 Доступ к только что склонированному объекту $dateTime = new DateTime(); echo (clone $dateTime)->format('Y');
    Сравнение объектов

    При использовании оператора сравнения ==, сравниваются свойства объекта, два объекта равны, если они имеют одинаковые атрибуты и значения
    При использовании оператора идентичности ===, два объекта равны, если переменные ссылаются на экземпляр одного и того же класса

    #Функция преобразует булево значение в строку function boolAdd($bool) { return (string) $bool; } #Функция сравнивает два объекта различными операторами function compareObj(&$obj1, &$obj2) { echo 'obj1 == obj2: ' . boolAdd($obj1 == $obj2) . "<br>"; echo 'obj1 != obj2: ' . boolAdd($obj1 != $obj2) . "<br>"; echo 'obj1 === obj2: ' . boolAdd($obj1 === $obj2) . "<br>"; echo 'obj1 !== obj2: ' . boolAdd($obj1 !== $obj2) . "<br>"; } #Первый класс для сравнения class Flag { public $flag; function __construct($flag = true) { $this->flag = $flag; } } #Второй класс для сравнения class OtherFlag { public $flag; function __construct($flag = true) { $this->flag = $flag; } } $obj1 = new Flag(); $obj2 = new Flag(); $obj3 = new OtherFlag(); $obj4 = $obj2; echo "<br><br>Два экземпляра одного и того же класса<br>"; compareObj($obj1, $obj2); echo "<br><br>Две ссылки на один и тот же экземпляр<br>"; compareObj($obj2, $obj4); echo "<br><br>Два экземпляра разных классов<br>"; compareObj($obj2, $obj3); Два экземпляра одного и того же класса obj1 == obj2: 1 obj1 != obj2: obj1 === obj2: obj1 !== obj2: 1 Две ссылки на один и тот же экземпляр obj1 == obj2: 1 obj1 != obj2: obj1 === obj2: 1 obj1 !== obj2: Два экземпляра разных классов obj1 == obj2: obj1 != obj2: 1 obj1 === obj2: obj1 !== obj2: 1
    Источники
    Последнее изменение: 20.11.2024 01:53


    Связанные темы
    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ