Operadores de tipo

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(55);
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().