я использую PHP 7.3.0
Рассмотрим ниже код из Руководство по PHP :
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
?>
Вывод вышеуказанного кода:
bool(true)
Насколько я понимаю, переменная объекта $obj1
содержит идентификатор объекта, который позволяет методам доступа к объекту найти фактический объект класса Test
,
Затем, как эта переменная объекта с именем $obj1
был префикс с ключевым словом new
когда он присваивается переменной $obj2
?
Переменная объекта $obj1
должен содержать идентификатор объекта для объекта класса Test
,
Что было достигнуто здесь с помощью new
Ключевое слово с переменной объекта, которая уже содержит некоторый идентификатор объекта?
Что на самом деле сравнивается в var_dump()
заявление?
Почему вывод сравнения верен?
new $obj1
создаст новый экземпляр $obj1::class
(который Test
).
Сравнение в пределах var_dump()
Заявление является строгий сравнение между двумя объектами. Возвращается true
потому что это строгое сравнение проверяет, что эти два экземпляра ($obj1
а также $obj2
) не являются ссылками на один и тот же экземпляр одного и того же класса.
Если сравнение не было строгим (например, $obj1 != $obj2
) это вернется ложный, поскольку $obj1 == $obj2
(например, оба имеют одинаковые атрибуты и значения и являются экземплярами одного и того же класса)
Узнайте больше о сравнении объектов на эта страница в документации.
То, что вы используете 7.3, в основном несущественно. Вы бы получили те же результаты с 5.3 года
Других решений пока нет …