próbowałem ten kod:PHP 7 - Porównanie anonimową klasę Przypadki
$ac1 = new class {};
$ac2 = new class {};
var_dump($ac1); // object([email protected])#1 (0) {}
var_dump($ac2); // object([email protected])#2 (0) {}
var_dump(new class {}); // object([email protected])#3 (0) {}
var_dump($ac1 == $ac2); // bool(false)
var_dump($ac1 == new class {}); // bool(false)
var_dump($ac2 == new class {}); // bool(false)
Wynikiem powyższych porównań są fałszywy.
Jednak, kiedy zadeklarować funkcję zwracającą anonimową klasę, jest to wynik:
function anonymous_class() {
return new class {};
}
$ac1 = anonymous_class();
$ac2 = anonymous_class();
var_dump($ac1); // object([email protected])#1 (0) {}
var_dump($ac2); // object([email protected])#2 (0) {}
var_dump(anonymous_class()); // object([email protected])#3 (0) {}
var_dump($ac1 == $ac2); // bool(true)
var_dump($ac1 == anonymous_class()); // bool(true)
var_dump($ac2 == anonymous_class()); // bool(true)
wszystkich drukowanych prawdziwą.
Teraz pytanie brzmi: jak do tego doszło? W szczególności, dlaczego wydrukowano dla drugiego kontekstu: true, wiedząc, że każda z var_dump()
wystąpień była inna?
Jako szybka i luźna odpowiedź: w twojej pierwszej próbce masz trzy różne "fizyczne" deklaracje "klasy", które stają się trzema różnymi klasami. W drugiej próbce masz tylko jedną "klasę" i trzy jej wystąpienia. – deceze
@deceze Podałeś dobre podsumowanie. Dlaczego nie uczynić z tego odpowiedzi? –
@chumkiu już to wykonało. – deceze