Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 43 di 50
  • livello avanzato
Indice lezioni

Il tipo degli oggetti

Instanceof: come ottenere il tipo dei nostri oggetti e scoprire se un oggetto è un'istanza di una determinata classe
Instanceof: come ottenere il tipo dei nostri oggetti e scoprire se un oggetto è un'istanza di una determinata classe
Link copiato negli appunti

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.

Ti consigliamo anche