W3docs

instanceof

Erfahren Sie, wie der PHP instanceof-Operator prüft, ob ein Objekt zu einer Klasse, Elternklasse oder implementierten Schnittstelle gehört, mit Beispielen.

Der PHP-Operator instanceof

instanceof ist ein PHP-Typprüfungsoperator. Er gibt einen boolean-Wert (true oder false) zurück und gibt an, ob ein Objekt zu einer bestimmten Klasse gehört – oder, was noch nützlicher ist, ob es zu einer Elternklasse in der Vererbungskette gehört oder eine bestimmte Schnittstelle implementiert.

Diese Seite behandelt die Syntax, das Verhalten von instanceof bei Vererbung und Schnittstellen, die Verwendung mit einem in einer Variablen gespeicherten Klassennamen, die Sonderfälle, die Überraschungen bereiten (Nicht-Objekte, null, unbekannte Klassennamen) und wann Sie ihn gegenüber einer eleganteren Alternative bevorzugen sollten.

Wenn Klassen und Objekte neu für Sie sind, lesen Sie zuerst PHP-Klassen und -Objekte.

Syntax

$object instanceof ClassName

Der Ausdruck wertet zu true aus, wenn $object eine Instanz von ClassName ist, einer Klasse, die ClassName erweitert, oder einer Klasse, die ClassName implementiert (wenn ClassName eine Schnittstelle ist). Andernfalls wertet er zu false aus. Beachten Sie, dass es keine Methodenaufruf-Syntax gibt – instanceof ist ein Operator wie ===, keine Funktion.

Eine einfache Prüfung

<?php

class MyClass {}
class MyOtherClass {}

$object = new MyClass();

if ($object instanceof MyClass) {
    echo "The object is an instance of MyClass.";
} else {
    echo "The object is not an instance of MyClass.";
}
// Output: The object is an instance of MyClass.

var_dump($object instanceof MyOtherClass);
// Output: bool(false)

$object wurde aus MyClass erstellt, daher ist die erste Prüfung true. Mit MyOtherClass hat es nichts zu tun, daher ist diese Prüfung false. Die beiden Klassen sind unabhängig voneinander, auch wenn sie ähnlich aussehen.

instanceof und Vererbung

Der eigentliche Wert von instanceof liegt darin, dass er die Vererbungskette aufwärts durchläuft. Ein Kind-Objekt ist eine Instanz seiner Elternklasse, daher gelingt die Prüfung für jeden Vorfahren.

<?php

class Fruit {}
class Apple extends Fruit {}
class Banana extends Fruit {}

$apple = new Apple();

var_dump($apple instanceof Apple);   // bool(true)  — its own class
var_dump($apple instanceof Fruit);   // bool(true)  — its parent class
var_dump($apple instanceof Banana);  // bool(false) — a sibling class

$apple besteht die Fruit-Prüfung, weil Apple von Fruit erbt. Die Banana-Prüfung schlägt fehl, weil Apple und Banana Geschwister sind – keines erbt vom anderen. Erfahren Sie mehr unter PHP-Vererbung.

instanceof und Schnittstellen

instanceof wird am häufigsten mit Schnittstellen verwendet. Da jede Klasse, die eine Schnittstelle implementiert, als Instanz davon gilt, können Sie auf eine Fähigkeit prüfen, ohne sich um die konkrete Klasse kümmern zu müssen.

<?php

interface Drawable {
    public function draw(): string;
}

class Circle implements Drawable {
    public function draw(): string { return "○"; }
}

class Square implements Drawable {
    public function draw(): string { return "□"; }
}

$shapes = [new Circle(), new Square(), "not a shape"];

foreach ($shapes as $shape) {
    if ($shape instanceof Drawable) {
        echo $shape->draw();
    }
}
// Output: ○□

Der string "not a shape" wird übersprungen, weil er kein Drawable ist. Dies ist der alltägliche Anwendungsfall: Eine gemischte Liste auf Objekte filtern, die das benötigte Verhalten unterstützen. Das vollständige Bild finden Sie unter PHP-Schnittstellen.

Einen Klassennamen aus einer Variablen verwenden

Die rechte Seite kann eine string-Variable sein, die einen Klassen- oder Schnittstellennamen enthält. Dies ist nützlich, wenn der Typ zur Laufzeit bestimmt wird.

<?php

class Fruit {}
class Apple extends Fruit {}

$apple = new Apple();
$type  = 'Fruit';

var_dump($apple instanceof $type);   // bool(true)

Sie können auch zwei Objekte vergleichen – $a instanceof $b funktioniert, wenn $b ein Objekt ist, und prüft, ob $a eine Instanz der Klasse von $b ist.

Sonderfälle und Fallstricke

instanceof wirft nie eine Ausnahme und gibt keine Warnung aus. Wenn der linke Operand kein Objekt ist, gibt er einfach false zurück.

<?php

class Fruit {}

var_dump(null instanceof Fruit);      // bool(false)
var_dump("Fruit" instanceof Fruit);   // bool(false) — a string is not an object
var_dump(42 instanceof Fruit);        // bool(false)

Dadurch ist instanceof sicher als Wächter vor dem Aufruf einer Methode zu verwenden, ohne vorher is_object() prüfen zu müssen. Wenn Sie nur wissen möchten, ob ein Wert überhaupt ein Objekt ist (beliebige Klasse), verwenden Sie stattdessen is_object().

Ein subtiler Punkt: Wenn Sie einen nicht vorhandenen Klassennamen als string-Literal auf der rechten Seite übergeben, lädt PHP ihn nicht automatisch und gibt keinen Fehler aus – es gibt einfach false zurück. Ein Tippfehler im Klassennamen schlägt also lautlos fehl. Bevorzugen Sie den blanken Klassennamen ($x instanceof Fruit) gegenüber einem string, wenn möglich, damit der Parser ihn validiert.

Wann instanceof verwendet werden sollte – und wann nicht

Verwenden Sie instanceof, wenn Sie tatsächlich einen Wert haben, dessen Typ Sie nicht garantieren können: Daten von json_decode, eine gemischte Sammlung, ein von Benutzercode zurückgegebenes Plugin oder ein catch-Block, der eine Ausnahme einschränkt.

<?php

try {
    throw new InvalidArgumentException("bad input");
} catch (Exception $e) {
    if ($e instanceof InvalidArgumentException) {
        echo "Caught an argument error: " . $e->getMessage();
    }
}
// Output: Caught an argument error: bad input

Vermeiden Sie es, instanceof-Prüfungen durch Ihren Code zu verstreuen, um nach Typ zu verzweigen – lange if ($x instanceof A) … elseif ($x instanceof B)-Ketten bedeuten meist, dass eine Methode auf jeder Klasse definiert und stattdessen polymorph aufgerufen werden sollte. Verwenden Sie instanceof um eine Operation zu schützen, nicht um Vererbung zu ersetzen.

Zusammenfassung

  • $object instanceof ClassName gibt true zurück, wenn das Objekt eine Instanz der Klasse, einer Unterklasse oder einer implementierten Schnittstelle ist.
  • Er durchläuft die vollständige Vererbungskette und gleicht Schnittstellen ab – das macht ihn so leistungsfähig.
  • Er gibt false zurück (nie einen Fehler) für null, Skalare und andere Nicht-Objekte, ist also sicher als Wächter.
  • Ein nicht vorhandener Klassenname, der als string übergeben wird, gibt false lautlos zurück; bevorzugen Sie den blanken Klassennamen.
  • Verwenden Sie ihn, um den Typ eines unbekannten Wertes zu überprüfen, bevor Sie darauf reagieren, nicht als Ersatz für Polymorphismus.

Übungen

Übung
Wozu dient der 'instanceof'-Operator in PHP?
Wozu dient der 'instanceof'-Operator in PHP?
Was this page helpful?