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