PHP 7-сравнение анонимных экземпляров класса
Я попробовал этот код:
$ac1 = new class {};
$ac2 = new class {};
var_dump($ac1); // object(class@anonymous)#1 (0) {}
var_dump($ac2); // object(class@anonymous)#2 (0) {}
var_dump(new class {}); // object(class@anonymous)#3 (0) {}
var_dump($ac1 == $ac2); // bool(false)
var_dump($ac1 == new class {}); // bool(false)
var_dump($ac2 == new class {}); // bool(false)
Результат приведенных выше сравнений вселожные .
Однако, когда я объявляю функцию, которая возвращает анонимный класс, это результат:
function anonymous_class() {
return new class {};
}
$ac1 = anonymous_class();
$ac2 = anonymous_class();
var_dump($ac1); // object(class@anonymous)#1 (0) {}
var_dump($ac2); // object(class@anonymous)#2 (0) {}
var_dump(anonymous_class()); // object(class@anonymous)#3 (0) {}
var_dump($ac1 == $ac2); // bool(true)
var_dump($ac1 == anonymous_class()); // bool(true)
var_dump($ac2 == anonymous_class()); // bool(true)
Все напечатано верно.
Теперь вопрос в том, как это произошло? В частности, почему он напечатал true для второго контекста, зная, что каждыйvar_dump()
из экземпляров приводит по-разному?1 ответ:
От doc http://php.net/manual/en/language.oop5.anonymous.php
Все объекты, созданные одним и тем же анонимным объявлением класса, являются экземплярами этого самого класса.
<?php function anonymous_class() { return new class {}; } if (get_class(anonymous_class()) === get_class(anonymous_class())) { echo 'same class'; } else { echo 'different class'; }
Приведенный выше пример выведет: тот же класс
И от http://php.net/manual/en/language.oop5.object-comparison.php
При использовании оператора сравнения
==
объектные переменные сравниваются простым способом, а именно: два объекта экземпляры равны, если они имеют одинаковые атрибуты и значения (значения сравниваются с ==), и являются экземплярами одного класса.