instanceof se utiliza para determinar si una variable de PHP es un objeto instanciado de una cierta clase:
Ejemplo #1 Utilizando instanceof con clases
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
El resultado del ejemplo sería:
bool(true) bool(false)
instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que hereda de una clase padre:
Ejemplo #2 Utilizando instanceof con clases heredadas
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Para comprobar si un objeto no es una instancia de una clase, se puede usar el operador lógico not.
Ejemplo #3 Utilizando instanceof para verificar si un objeto no es una instancia de una clase
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
El resultado del ejemplo sería:
bool(true)
Finalmente, instanceof también se puede utilizar para determinar si una variable es un objeto instanciado de una clase que implementa una interface:
Ejemplo #4 Utilizando instanceof para la clase
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
El resultado del ejemplo sería:
bool(true) bool(true)
Aunque instanceof se utiliza generalmente con un nombre de clase literal, también puede ser utilizado con otro objeto o una variable string:
Ejemplo #5 Utilizando instanceof con otras variables
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>
El resultado del ejemplo sería:
bool(true) bool(true) bool(false)
instanceof no lanza ningún error si la variable que está siendo comprobada no es
un objeto, simplemente devuelve FALSE
. Las constantes, sin embargo, no está permitidas.
Ejemplo #6 Usar instanceof para comprobar otras variables
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a es un entero
var_dump($b instanceof stdClass); // $b es NULL
var_dump($c instanceof stdClass); // $c es un recurso
var_dump(FALSE instanceof stdClass);
?>
El resultado del ejemplo sería:
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Hay algunas trampas a tener en cuenta. Antes de versión de PHP 5.1.0, instanceof llamaría a __autoload() si el nombre de clase no existía. Además, si la clase no estaba cargada, un error fatal ocurriría. Esto se puede solucionar mediante una referencia de clase dinámica o una variable string que contenga el nombre de la clase:
Ejemplo #7 Evitando búsquedas del nombre de clase y errores fatales con instanceof en PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // aquí no hay error fatal
?>
El resultado del ejemplo sería:
bool(false)
El operador instanceof fue introducido en PHP 5. Antes de esta época se utilizaba is_a(), pero desde entonces is_a() se ha quedado obsoleto en favor de instanceof. Tenga en cuenta que a partir de PHP 5.3.0, is_a() ya no está obsoleto.
Ver también get_class() y is_a().