instanceof
wird dazu verwendet um festzustellen, ob ein
gegebenes Objekt ein Objekt ist, das zu einer bestimmten
Klasse gehört.
Beispiel #1 Die Verwendung von instanceof
mit Klassen
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true) bool(false)
instanceof
kann auch verwendet werden, um zu bestimmen, ob
ein Variable ein Exemplar einer Klasse ist, die von einer Elternklasse erbt:
Beispiel #2 Verwendung von instanceof
mit ererbten Klassen
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true) bool(true)
Um zu prüfen, ob ein Objekt nicht ein Exemplar einer Klasse ist,
kann der logische nicht
Operator verwendet werden.
Beispiel #3
Verwendung von instanceof
, um zu prüfen, ob ein Objekt
kein Exemplar einer Klasse ist
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true)
Schließlich kann instanceof
auch dazu verwendet werden, um zu
bestimmen, ob eine Variable ein Exemplar einer Klasse ist, die ein
Interface implementiert:
Beispiel #4 Verwendung von instanceof
mit Interfaces
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true) bool(true)
Obwohl instanceof
üblicherweise mit einem Klassennamensbezeichner
verwendet wird, kann es ebenfalls mit einem anderen Objekt oder einer
Zeichenkettenvariablen verwendet werden:
Beispiel #5 Verwendung von instanceof
mit anderen Variablen
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b ist ein Exemplar der Klasse MyClass
var_dump($a instanceof $c); // $c ist die Zeichenkette 'MyClass'
var_dump($a instanceof $d); // $d ist die Zeichenkette 'NotMyClass'
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(true) bool(true) bool(false)
instanceof löst keinen Fehler aus, wenn die getestete Variable kein Objekt ist;
es gibt dann einfach FALSE
zurück. Konstanten waren allerdings vor PHP 7.3.0 nicht erlaubt.
Beispiel #6 Verwendung von instanceof
um andere Variablen zu prüfen
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a ist eine Ganzzahl
var_dump($b instanceof stdClass); // $b ist NULL
var_dump($c instanceof stdClass); // $c ist ein Ressource
var_dump(FALSE instanceof stdClass);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Von PHP 7.3.0 an sind Konstanten auf der linken Seite des instanceof
Operators erlaubt.
Beispiel #7 Verwendung von instanceof
um Konstanten zu prüfen
<?php
var_dump(FALSE instanceof stdClass);
?>
>Das oben gezeigte Beispiel erzeugt folgende Ausgabe mit PHP 7.3:
bool(false)
Es gibt ein paar Fallstricke zu beachten. Vor PHP-Version 5.1.0 rief
instanceof
__autoload() auf, wenn der Klassenname
nicht existierte. Zusätzliche wurde, wenn die Klasse nicht geladen werden konnte,
ein fataler Fehler ausgelöst. Es ist möglich dies zu umgehen, indem eine dynamische
Klassenreferenz oder eine Zeichenkettenvariable, die den Klassennamen enthält,
verwendet wird:
Beispiel #8 Vermeidung von Klassennamenssuchen und fataler Fehler mit instanceof
in PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // kein fataler Fehler
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
bool(false)
Der instanceof
Operator wurde in PHP 5 eingeführt. Davor wurde
is_a() verwendet, aber is_a() wurde seither
zugunsten von instanceof
missbilligt. Es ist zu beachten, dass
is_a() von PHP 5.3.0 nicht länger missbilligt ist.
Siehe auch get_class() und is_a().