Клонирование объектов
Клонирование объектов
Копия объекта создается с помощью ключевого слова 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
Источники
Связанные темы
Оператор разрешения видимости в php
Позднее статическое связывание
Методы создания экземпляра класса в php
Автоматическая загрузка классов
Наследование с помощью extends в php
Конструкторы и деструкторы в php