Operadores de tipos

instanceof se utiliza para determinar si una variable PHP es un objeto instanciado de una cierta clase:

Ejemplo #1 Uso de instanceof con clases

<?php
class MiClase
{
}
class
NoMiClase
{
}
$a = new MiClase;

var_dump($a instanceof MiClase);
var_dump($a instanceof NoMiClase);
?>

El resultado del ejemplo sería:

bool(true)
bool(false)

instanceof también puede ser utilizado para determinar si una variable es un objeto instanciado de una clase que hereda de una clase padre:

Ejemplo #2 Uso de instanceof con clases heredadas

<?php
class ClasePadre
{
}
class
MiClase extends ClasePadre
{
}
$a = new MiClase;

var_dump($a instanceof MiClase);
var_dump($a instanceof ClasePadre);
?>

El resultado del ejemplo sería:

bool(true)
bool(true)

Para verificar si un objeto no es una instancia de una clase, el operador lógico not puede ser utilizado.

Ejemplo #3 Uso de instanceof para verificar que el objeto no es una instancia de la clase

<?php
class MiClase
{
}
$a = new MiClase;
var_dump(!($a instanceof stdClass));
?>

El resultado del ejemplo sería:

bool(true)

Y finalmente, instanceof puede ser utilizado para determinar si una variable es un objeto instanciado de una clase que implementa una interface:

Ejemplo #4 Uso de instanceof para una interface

<?php
interface MiInterface
{
}
class
MiClase implements MiInterface
{
}
$a = new MiClase;

var_dump($a instanceof MiClase);
var_dump($a instanceof MiInterface);
?>

El resultado del ejemplo sería:

bool(true)
bool(true)

Aunque instanceof se utiliza habitualmente con un nombre de clase literal, también puede ser utilizado con otro objeto o una cadena representando una variable:

Ejemplo #5 Uso de instanceof con otras variables

<?php
interface MiInterface
{
}
class
MiClase implements MiInterface
{
}
$a = new MiClase;
$b = new MiClase;
$c = 'MiClase';
$d = 'NoMiClase';
var_dump($a instanceof $b); // $b es un objeto de la clase MiClase
var_dump($a instanceof $c); // $c es una cadena 'MiClase'
var_dump($a instanceof $d); // $d es una cadena 'NoMiClase'
?>

El resultado del ejemplo sería:

bool(true)
bool(true)
bool(false)

instanceof no lanza ningún error si la variable probada no es un objeto, simplemente devolverá false. Sin embargo, las constantes no están permitidas.

Ejemplo #6 Uso de instanceof para probar otras variables

<?php
$a
= 1;
$b = NULL;
$c = fopen('/tmp/', 'r');
var_dump($a instanceof stdClass); // $a es un entero
var_dump($b instanceof stdClass); // $b vale 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 espera una instancia de objeto, constante dada

A partir de PHP 7.3.0, las constantes están permitidas en el lado izquierdo del operador instanceof.

Ejemplo #7 Uso de instanceof para probar constantes

<?php
var_dump
(FALSE instanceof stdClass);
?>

Salida del ejemplo anterior en PHP 7.3:

bool(false)

A partir de PHP 8.0.0, instanceof puede ahora ser utilizado con expresiones arbitrarias. La expresión debe estar entre paréntesis y producir una string.

Ejemplo #8 Uso de instanceof con una expresión arbitraria

<?php

class ClaseA extends \stdClass {}
class
ClaseB extends \stdClass {}
class
ClaseC extends ClaseB {}
class
ClaseD extends ClaseA {}

function
obtenerAlgunaClase(): string
{
return
ClaseA::class;
}

var_dump(new ClaseA instanceof ('std' . 'Class'));
var_dump(new ClaseB instanceof ('Class' . 'B'));
var_dump(new ClaseC instanceof ('Class' . 'A'));
var_dump(new ClaseD instanceof (obtenerAlgunaClase()));
?>

Salida del ejemplo anterior en PHP 8:

bool(true)
bool(true)
bool(false)
bool(true)

El operador instanceof tiene una variante funcional con la función is_a().

Ver también