Ich bin mir bewusst, dass instanceof
ein Operator und is_a
eine Methode ist.
Ist die Leistung der Methode langsamer? Was würdest du lieber benutzen?
Ich bin mir bewusst, dass instanceof
ein Operator und is_a
eine Methode ist.
Ist die Leistung der Methode langsamer? Was würdest du lieber benutzen?
Antworten:
Aktualisieren
Ab PHP 5.3.9 hat sich die Funktionalität von
is_a()
geändert. Die ursprüngliche Antwort unten besagt, dass ein als erstes Argument akzeptiert werdenis_a()
muss ,Object
PHP-Versionen> = 5.3.9 akzeptieren jetzt jedoch ein optionales drittes boolesches Argument$allow_string
(standardmäßigfalse
), um stattdessen Vergleiche von Zeichenfolgenklassennamen zu ermöglichen:Der Hauptunterschied im neuen Verhalten zwischen
instanceof
undis_a()
besteht darin, dassinstanceof
immer überprüft wird, ob das Ziel ein instanziiertes Objekt der angegebenen Klasse ist (einschließlich erweiterter Klassen), währendis_a()
das Objekt nur instanziiert werden muss, wenn das$allow_string
Argument auf den Standardwert von gesetzt istfalse
.Original
Eigentlich
is_a
ist eine Funktion, währendinstanceof
es sich um ein Sprachkonstrukt handelt.is_a
wird erheblich langsamer sein (da der gesamte Aufwand für die Ausführung eines Funktionsaufrufs anfällt), aber die Gesamtausführungszeit ist bei beiden Methoden minimal.Ab 5.3 ist es nicht mehr veraltet, daher gibt es dort keine Sorgen mehr.
Es gibt jedoch einen Unterschied.
is_a
Als Funktion wird ein Objekt als Parameter 1 und eine Zeichenfolge (Variable, Konstante oder Literal) als Parameter 2 verwendet. Also:instanceof
Nimmt ein Objekt als Parameter 1 und kann einen Klassennamen (Variable), eine Objektinstanz (Variable) oder eine Klassenkennung (Klassenname ohne Anführungszeichen) als Parameter 2 verwenden.quelle
is_a
veraltet?$class = 'Foo'; var_dump($obj instanceof $class);
is_a
gegenüber deminstanceof
Operator beachten sollten , ist, dassis_a
Ausdrücke für den zweiten Parameter akzeptiert werden, während dies nicht der Fall ist. Zum Beispielis_a($object, 'Prefix_'.$name)
funktioniert, während$object instanceof 'Prefix_'.$name
nichtis_a
sollte niemals in erster Linie veraltet sein. Es ist allerdings etwas spät, das Problem jetzt zu beheben. Das Problem ist, dass derinstanceof
Operator Syntaxfehler in PHP 4is_a
auslöst. Da dies genau zur gleichen Zeit veraltet war, als der Operator eingeführt wurde, war es unmöglich, Code für PHP 4 und 5 zu schreiben, ohne ein E_STRICT herumzuwerfen. Sie können nicht einmal tun,if (version_compare(PHP_VERSION, 5) >= 0) { /* use instanceof */ } else { /* use is_a */ }
weil es immer noch einen Syntaxfehler in PHP 4 verursachen würde.Hier sind die Leistungsergebnisse von is_a () und instanceof :
Testquelle ist hier .
quelle
php 7
gibt es keinen Unterschied.instanceof
kann mit anderen Objektinstanzen, dem Klassennamen oder einer Schnittstelle verwendet werden.Ich denke nicht, dass(Update: Siehe https://gist.github.com/1455148 )is_a()
das mit Schnittstellen funktioniert (nur eine Zeichenfolge, die einen Klassennamen darstellt), aber korrigiere mich, wenn dies der Fall ist.Beispiel von php.net :
Ausgänge:
quelle
is_a
funktioniert mit Schnittstellen genauso wieinstanceof
(ich wollte dasselbe sagen, aber ich habe es vor dem Absenden überprüft, und es funktioniert tatsächlich) ...In Bezug auf die Antwort von ChrisF ist ab PHP 5.3.0
is_a()
nicht mehr veraltet . Ich finde es immer sicherer, sich für solche Dinge an die offizielle Quelle zu wenden.In Bezug auf Ihre Frage, Daniel, kann ich nichts über die Leistungsunterschiede sagen, aber ein Teil davon hängt von der Lesbarkeit ab, mit der Sie leichter arbeiten können.
Auch gibt es einige Diskussionen über die Verwirrung um negiert einen
instanceof
Scheck vsis_a()
. Zum Beispielinstanceof
würden Sie tun:vs die folgenden für
is_a()
:oder
Bearbeiten Sieht so aus, als hätte ChrisF seine Antwort gelöscht, aber der erste Teil meiner Antwort steht noch.
quelle
Neben der Geschwindigkeit ist ein weiterer wichtiger Unterschied, wie sie mit Kantenfällen umgehen.
Is_a () hebt mögliche Fehler hervor, während die Instanz sie unterdrückt.
quelle
Die Optimierung ist minimal. Und Mikrooptimierungen sind angesichts der Lesbarkeit, Verständlichkeit und Stabilität des Codes niemals eine wirklich gute Antwort.
(Ich persönlich bevorzuge eine Instanz davon , aber die Wahl liegt bei Ihnen;))
Der Hauptunterschied besteht in der Möglichkeit, den direkten Klassennamen mit instanceof zu verwenden
ist kürzer als
(ok ... es ist nicht trivial.)
Die syntaktische Färbung zwischen instanceof (Sprachstruktur) und is_a ist ebenfalls nützlich (für mich). Funktionsfarbe für größere Operationen verwenden. Und für den einmaligen Gebrauch, wenn zum Beispiel nicht mehr Klammern benötigt werden.
Hinweis: Natürlich können Sie anstelle von MyClass :: class auch eine kürzere direkte Zeichenfolge verwenden:
Die Verwendung einer direkten Zeichenfolge in einem Code ist jedoch keine gute Vorgehensweise .
Die syntaktische Sortierung ist besser und nützlicher, wenn Sie zwischen einfachen Zeichenfolgen- und Klassennamen unterscheiden können. Und es ist einfacher, Namen mit konstantem Klassennamen zu ändern. Besonders, wenn Sie einen Namespace mit Alias verwenden.
Also, warum is_a () verwenden ?
Aus demselben Grund: Lesbarkeit und Verständlichkeit. (Sie haben die Wahl) Spezial bei Verwendung mit ! oder andere boolesche Operatoren: is_a scheint mit Klammern praktischer zu sein.
ist besser lesbar als:
Ein weiterer guter Grund ist, wenn Sie Rückruf in Funktionen verwenden müssen. (wie array_map …) instanceof ist keine Funktion, sondern ein Sprachkonstrukt, daher können Sie es nicht als Rückruf verwenden.
In diesen Fällen kann is_a nützlich sein
quelle
Ich kann nicht für Leistung sprechen - ich habe noch nichts gemessen - aber je nachdem, was Sie versuchen, gibt es Einschränkungen bei
instanceof
. Schauen Sie sich erst kürzlich meine Frage dazu an:PHP 'instanceof' schlägt mit Klassenkonstante fehl
Ich habe
is_a
stattdessen verwendet. Ich mag die Struktur voninstanceof
besser (ich denke, sie liest sich besser) und werde sie weiterhin verwenden, wo ich kann.quelle
Hier sind die Leistungsergebnisse, die Sie hier erhalten :
instanceof
ist schneller.Funktionen
Zeiten (jeweils 5000 Mal ausgeführt)
quelle
Es gibt ein Szenario, in dem nur
is_a()
funktioniert undinstanceof
fehlschlägt.instanceof
erwartet einen Literalklassennamen oder eine Variable, die entweder ein Objekt oder eine Zeichenfolge (mit dem Namen einer Klasse) als rechtes Argument ist.Wenn Sie jedoch die Zeichenfolge eines Klassennamens aus einem Funktionsaufruf bereitstellen möchten, funktioniert dies nicht und führt zu einem Syntaxfehler.
Das gleiche Szenario funktioniert jedoch einwandfrei
is_a()
.Beispiel:
Dies basiert auf PHP 7.2.14.
quelle