PHP 7 — 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)

Все напечатано правда.

Теперь вопрос в том, как это случилось? В частности, почему он напечатал правда для второго контекста, зная, что каждый var_dump() из приведенных примеров иначе?

9

Решение

Из документа 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

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]