Operadores de Tipo

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

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 con interfaces

<?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 es un objeto de la clase MyClass
var_dump($a instanceof $c); // $c es un string 'MyClass'
var_dump($a instanceof $d); // $d es un 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 antes de PHP 7.3.0.

Ejemplo #6 Utilizando 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

Desde PHP 7.3.0, se permiten constantes en el lado izquierdo del operador instanceof.

Ejemplo #7 Utilizando instanceof para comprobar constantes

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

Salida del ejemplo anterior en PHP 7.3:

bool(false)

Desde PHP 8.0.0, instanceof puede ahora ser usado con expresiones arbitrarias. La expresión debe estar envuelto entre parentesis y producir un string.

Ejemplo #8 Utilizando instanceof con expresiones arbitrarias

<?php

class ClassA extends \stdClass {}
class
ClassB extends \stdClass {}
class
ClassC extends ClassB {}
class
ClassD extends ClassA {}

function
getSomeClass(): string
{
return
ClassA::class;
}

var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>

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