Как ключевое слово «new» используется с «переменной объекта», которая уже содержит «идентификатор объекта» для некоторого уже существующего «объекта» некоторого класса? - PullRequest
0 голосов
/ 06 января 2019

Я использую 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()?

Почему вывод сравнения верен?

1 Ответ

0 голосов
/ 06 января 2019

new $obj1 создаст новый экземпляр $obj1::class (то есть Test).

Сравнение в заявлении var_dump() представляет собой строгое сравнение между двумя объектами. Он возвращает true, потому что это строгое сравнение проверяет, что эти два экземпляра ($obj1 и $obj2) не ссылаются на один и тот же экземпляр одного и того же класса.

Если бы сравнение не было строгим (например, $obj1 != $obj2), было бы возвращено false , поскольку $obj1 == $obj2 (например, оба имеют одинаковые атрибуты и значения и являются экземплярами одного и того же класса)

Подробнее о сравнении объектов на этой странице в документации.

То, что вы используете 7.3, в основном несущественно. Вы бы получили те же результаты с 5.3 года

...