2016-10-06 18 views
8

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?

+4

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

+0

@deceze Podałeś dobre podsumowanie. Dlaczego nie uczynić z tego odpowiedzi? –

+0

@chumkiu już to wykonało. – deceze

Odpowiedz

5

Od doc http://php.net/manual/en/language.oop5.anonymous.php

Wszystkie obiekty stworzone przez tę samą deklarację anonimowej klasy są instancjami tej samej klasy.

<?php 
function anonymous_class() 
{ 
    return new class {}; 
} 

if (get_class(anonymous_class()) === get_class(anonymous_class())) { 
    echo 'same class'; 
} else { 
    echo 'different class'; 
} 

Powyższy przykład Wydajność: samej klasy

A z http://php.net/manual/en/language.oop5.object-comparison.php

przypadku zastosowania operatora porównania == zmienne obiektów są porównywane w prosty sposób a mianowicie: dwie instancje obiektów są równe, jeśli mają te same atrybuty i wartości (wartości są porównywane z ==) i są instancjami tej samej klasy.

+0

Tak, przeczytałem, ale sprawdź dane wyjściowe 'var_dump()' każdej instancji, są różne. –

+3

@Rax '# 1' po nazwie klasy to * instance counter * (pierwsze wystąpienie' class @ anonymous'). Nazwa klasy jest identyczna we wszystkich przypadkach. – deceze

+0

Łącząc twoją odpowiedź z @ deceze daje mi to jasne spojrzenie. Niesamowite. –