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

Confrontare gli oggetti

Le varie tecniche per confrontare tra loro gli oggetti: uguaglianza ed identità
Le varie tecniche per confrontare tra loro gli oggetti: uguaglianza ed identità
Link copiato negli appunti

L'operazione di confronto tra due oggetti, per quanto immediata possa sembrare, racchiude svariate competenze che vanno oltre al semplice concetto di confronto di variabili. Innanzitutto occorre sapere che in PHP esistono due operatori per confrontare due variabili tra di loro:

  • l'operatore di uguaglianza ("=="): restituisce true se le due variabili contengono lo stesso valore, anche se sono di tipo diverso
  • l'operatore di identità ("==="): restituisce true se le due variabili contengono lo stesso valore e sono dello stesso tipo

Ciò significa che, ad esempio:

$a = 10;
$b = "10";
// restituisce true
($a == $b)      
// restituisce false
($a === $b)

Questa regola vale per il confronto tra tutti i tipi semplici di dato. Tuttavia, nel caso degli oggetti, nonostante gli operatori siano i medesimi, occorrono nuove regole per il confronto. Eccole:

  • l'operatore di uguaglianza: restituisce true se i due oggetti hanno le stesse coppie proprietà/valore e sono istanze della stessa classe
  • l'operatore di identità: restituisce true se e solo se i due oggetti si riferiscono alla stessa istanza della classe

Consci di queste nuove direttive, possiamo ora andare ad analizzare i casi pratici di confronti. Partiamo utilizzando l'operatore di uguaglianza:

function cmpobj($res) {
        echo ($res) ? "yes" : "no";
}
class A {
        public $a = 10;
        public $b = 20;
}
class B {
        public $a = 10;
        public $b = 20;
}
$a = new A;
$b = new A;
$c = new A;
$d = new B;
$c->a = 20;
// stampa "yes" (stesse proprietà, stessi valori)
cmpobj($a == $b);
// stampa "no" (stesse proprietà, valori differenti)
cmpobj($a == $c);
// stampa "no" (stesse proprietà, valori differenti)
cmpobj($b == $c);
// stampa "no" (diverso tipo)
cmpobj($a == $d);

Vediamo ora l'operatore di identità, che anche nel caso degli oggetti, è assai più restrittivo del precedente:

$a = new A;
$b = new A;
$c = new A;
$d = new B;
$c->a = 20;
// stampa "no" (stesse proprietà, stessi valori, istanze differenti)
cmpobj($a === $b);
// stampa "no" (istanze differenti)
cmpobj($a === $c);
// stampa "no" (istanze differenti)
cmpobj($b === $c);
// stampa "no"
cmpobj($a === $d);
$e = $a;
// stampa "yes" (stesse istanze)
cmpobj($a === $e)

Come possiamo notare, l'unico modo per ottenere un risultato positivo nel confronto tra oggetti utilizzando l'operatore di identità è che essi costituiscano la stessa istanza.

Conclusione

Per quanto rara possa essere l'operazione di confronto degli oggetti, essa presenta delle caratteristiche insolite rispetto alle semplici variabili, come abbiamo poututo vedere in questa lezione. Essere consci delle regole di confronto valide per le istanze è molto importante in uno scenario reale. Nella prossima lezione, l'ultima dello "step" degli extra, analizzeremo un nuovo operatore che ci permetterà di ottenere indicazioni sul tipo di un determinato oggetto.

Ti consigliamo anche