instanceof è utilizzato per determinare se una variabile PHP è un oggetto istanza di una certa classe:
Example #1 Utilizzo di instanceof con le classi
<?php
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>
Il precedente esempio visualizzerà:
bool(true) bool(false)
instanceof può essere usato anche per determinare se una variabile è un oggetto istanziato da una classe che eredita da una classe parente:
Example #2 Utilizzo di instanceof con le classi ereditate
<?php
class ParentClass
{
}
class MyClass extends ParentClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>
Il precedente esempio visualizzerà:
bool(true) bool(true)
Al fine di controllare se un oggetto non è un instanceof di una classe, si può usare l'operatore logico not .
Example #3 Utilizzo di instanceof per controllare se un oggetto non è un'instanceof di una classe
<?php
class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>
Il precedente esempio visualizzerà:
bool(true)
Infine, instanceof può essere usato anche per deretmnare se una variable è un oggetto istanziato da una classe che implementa una interfaccia:
Example #4 Utilizzo di instanceof per una classe
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>
Il precedente esempio visualizzerà:
bool(true) bool(true)
Anche se instanceof è normalmente usata con un nome di classe letterale, può essere usata con un altro oggetto o con una variabile stringa:
Example #5 Utilizzo di instanceof con altre variabili
<?php
interface MyInterface
{
}
class MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b è un oggetto di classe MyClass
var_dump($a instanceof $c); // $c è la stringa 'MyClass'
var_dump($a instanceof $d); // $d è la stringa 'NotMyClass'
?>
Il precedente esempio visualizzerà:
bool(true) bool(true) bool(false)
instanceof non genera errori se la variabile che viene controllata non è
un oggetto, ma ritorna semplicemente FALSE
. Le costanti non sono comunque ammesse.
Example #6 Utilizzo di instanceof per controllare altre variabili
<?php
$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
var_dump($a instanceof stdClass); // $a è un integer
var_dump($b instanceof stdClass); // $b è NULL
var_dump($c instanceof stdClass); // $c è una risorsa
var_dump(FALSE instanceof stdClass);
?>
Il precedente esempio visualizzerà:
bool(false) bool(false) bool(false) PHP Fatal error: instanceof expects an object instance, constant given
Ci sono alcune trappole da evitare. Prima di PHP 5.1.0, instanceof chiama __autoload() se il nome della classe non esiste. Inoltre, se la classe non è stata caricata, viene generato un errore fatale. Ciò può essere evitato usando un riferimento dinamico alla classe, o una variabile stringa che contenga il nome della classe:
Example #7 Evitare richerce del nome della classe ed errori fatali con instanceof in PHP 5.0
<?php
$d = 'NotMyClass';
var_dump($a instanceof $d); // l'errore fatale non avviene
?>
Il precedente esempio visualizzerà:
bool(false)
L'operatore instanceof è stato introdotto in PHP 5. Prima di questo si utilizzava is_a(), ma ora is_a() è deprecata in favore di instanceof. Si noti che dal PHP 5.3.0, is_a() non è più deprecata.
Vedere anche get_class() e is_a().