Per scoprire se un oggetto è un'istanza di una determinata classe, l'operatore instanceof è quello che fa al caso nostro. Basta usarlo in combinazione con la variabile desiderata e il nome della classe di cui si vuole verificare l'appartenenza:
$instance instanceof MyClass
Ecco un semplice esempio:
class MyClass {
public $a = 10;
public $b = 20;
public $c = 30;
}
class MyOtherClass {
public $a = 10;
public $b = 20;
public $c = 30;
}
$myClass_1 = new MyClass();
$myOtherClass_1 = new MyOtherClass();
// stampa "$myClass_1 è un'istanza della classe MyClass"
echo ($myClass_1 instanceof MyClass) ? "$myClass_1 è un'istanza della classe MyClass" : "$myClass_1 non è un'istanza della classe MyClass";
// stampa "$myOtherClass_1 non è un'istanza della classe MyClass"
echo ($myOtherClass_1 instanceof MyClass) ? "$myOtherClass_1 è un'istanza della classe MyClass" : "$myOtherClass_1 non è un'istanza della classe MyClass";
La variabile $myClass_1
è un'istanza della classe MyClass
, mentre la variabile $myOtherClass_1
non lo è.
Operatore instanceof e gerarchie
Anche l'operatore instanceof
agisce sulle gerarchie di classi: ciò significa che se una classe eredita da un'altra classe, essa avrà comunque il tipo della classe da cui eredita, in aggiunta al proprio. Questo concetto è valido anche nel caso delle interfacce: è possibile usare l'operatore instanceof
in collaborazione con il namespace di un'interfaccia e, se la classe la implementa, il risultato sarà true.
Ecco degli esempi:
interface ICommon {
public function doThis();
}
class MyClass {
public $a = 10;
public $b = 20;
public $c = 30;
}
class MyOtherClass extends MyClass {
public $d = 40;
public $e = 50;
public $f = 60;
}
class MyThirdClass implements ICommon {
public function doThis() {
echo "Done!";
}
}
$myClass_1 = new MyClass();
$myOtherClass_1 = new MyOtherClass();
$myThirdClass_1 = new MyThirdClass();
// stampa "no"
echo ($myClass_1 instanceof MyOtherClass) ? "yes" : "no";
// stampa "yes"
echo ($myOtherClass_1 instanceof MyClass) ? "yes" : "no";
// stampa "yes"
echo ($myOtherClass_1 instanceof MyOtherClass) ? "yes" : "no";
// stampa "yes"
echo ($myThirdClass_1 instanceof ICommon) ? "yes" : "no";
Come possiamo notare, l'oggetto $myClass_1
è un'istanza della classe MyClass
ma non della classe MyOtherClass
, mentre l'oggetto $myOtherClass_1
è un'istanza di entrambe le classi. L'oggetto $myThirdClass_1
implementa l'interfaccia ICommon
, dunque l'operatore instanceof
ha esito positivo.
Conclusione
L'operatore instanceof
non è l'unica modalità offerta da PHP per analizzare la classe di appartenenza di un'istanza (le funzioni is_a, get_class, is_subclass_of e get_parent_class sono tutte adatte a questo scopo), ma costituisce l'alternativa più valida tra tutte, dunque per qualsiasi compito di checking del tipo di un oggetto il suo utilizzo è fortemente consigliato, direttamente dai creatori del linguaggio, rispetto alle altre funzioni.