2016-05-13 12 views
1

Ich habe vor kurzem über den Unterschied zwischen is_a() und instanceof gelesen Ich verwende derzeit get_class, um einen Objektvergleich zu machen. Ich habe gelesen, dass is_a veraltet war, aber durch die populäre Nachfrage zurückgebracht wurde, obwohl instanceof etwas schneller ist. Wann würden Sie sich entscheiden, jede dieser Varianten zu verwenden und warum nicht stattdessen einen der anderen verwenden?Was ist der beste Weg zu bestimmen, ob eine Variable ein bestimmtes Objekt ist?

if (get_class($var) == 'MyObject') 

if ($var instanceof \MyObject) 

if (is_a($var, \MyObject)) 

Antwort

1

Es hängt davon ab, was Sie wirklich überprüfen möchten.

get_class check wird Ihnen sagen, ob das gegebene Objekt der gegebenen Klasse ist. instanceof operator auf der anderen Seite wird Ihnen sagen, ob ein gegebenes Objekt einer gegebenen Klasse angehört oder ob diese Klasse in ihrem Vererbungsbaum OR die angegebene Schnittstelle implementiert.

Einige Beispiele:

class Parent {} 
class Child extends Parent {} 

$obj = new Child; 

var_dump($obj instanceof Parent); // true 
var_dump(get_class($obj) === 'Parent'); // false 
var_dump($obj instanceof Child); // true 
var_dump(get_class($obj) === 'Child'); // true 

So beiden Wege können je nach verwendet werden, was Sie brauchen.

In Bezug auf is_a() verhält es sich genauso wie Instanceof Operator, aber wissen, etwas langsamer zu sein. Bei größeren Anwendungen ist der Leistungsunterschied vernachlässigbar.

instanceof bietet mehr Flexibilität. Während is_a() nur String als zweites Argument akzeptiert, kann instanceof eine Zeichenfolge, ein Objekt oder eine Klassenkennung übergeben werden.

+1

Oder implementiert eine Schnittstelle .. – dbf

1

Eine vierte Option ist:

Wenn Sie die Kontrolle über die Objektdefinition, dann eine öffentliche Eigenschaft zu Ihren Eltern Klassendefinition hinzufügen public $_myquirkyparentproperty = true; genannt, dann isset($var->_myquirkyparentproperty) verwenden. Dies ist die schnellste Objektidentifikation in PHP, wenn Sie die Kontrolle über die Objekte haben. Fügen Sie Ihrer Eltern- und Kindklasse andere Eigenschaften hinzu und verwenden Sie weiterhin isset(), um sie zu unterscheiden.

Hier ist ein Benchmark (-> _ srf_object ist meine persönliche Objekt-Eigenschaft), und $ a ist mein Ziel:

MIN: time ratio (500x), fastest times (least interference) 
[1."(isset($a->_srf_object))"] => 1.00x (5.006790161132812E-6) 
[2."(get_class($a))"] => 2.62x (1.311302185058594E-5) 

Achten Sie auf die Eigenschaft, etwas zu nennen, die mit anderen Klassen Eigenschaften kollidieren nicht. Vielleicht dein Name.

Verwandte Themen