Confronto di oggetti in PHP 5

Avvertimento

Questo modulo è SPERIMENTALE. Ovvero, il comportamento di queste funzioni, i nomi di queste funzioni, in definitiva tutto ciò che è documentato qui può cambiare nei futuri rilasci del PHP senza preavviso. Siete avvisati, l'uso di questo modulo è a vostro rischio.

In PHP 5, il confronto tra oggetti è più complicato che in PHP 4, ed è in armonia con quello che ci si può aspettare da un linguaggio orientato agli oggetti (non che PHP 5 lo sia veramente).

Quando si usa l'operatore di confronto (==), le variabili oggetto sono confrontate in modo semplice, cioè: due istanze di oggetto sono uguali se hanno gli stessi attributi e valori, e sono istanze della stessa classe, definita nello stesso spazio dei nomi.

Diversamente, quando usiamo l'operatore di identità (===), le variabili oggetto sono identiche se e solo se si riferiscono alla stessa istanza della stessa classe (in un particolare spazio dei nomi).

Un esempio chiarirà questa regola.

Esempio 18-3. Esempio di confronto di oggetti in PHP 5

<?php
function bool2str($bool) {
    if (
$bool === false) {
            return
'FALSE';
    } else {
            return
'TRUE';
    }
}

function
compareObjects(&$o1, &$o2) {
    echo
'o1 == o2 : '.bool2str($o1 == $o2)."\n";
    echo
'o1 != o2 : '.bool2str($o1 != $o2)."\n";
    echo
'o1 === o2 : '.bool2str($o1 === $o2)."\n";
    echo
'o1 !== o2 : '.bool2str($o1 !== $o2)."\n";
}

class
Flag {
    var
$flag;

    function
Flag($flag=true) {
            
$this->flag = $flag;
    }
}

namespace Other {

    class
Flag {
        var
$flag;

        function
Flag($flag=true) {
                
$this->flag = $flag;
        }
    }

}

$o = new Flag();
$p = new Flag();
$q = $o;
$r = new Other::Flag();

echo
"Due istanze della stessa classe\n";
compareObjects($o, $p);

echo
"\nDue riferimenti alla stessa istanza\n";
compareObjects($o, $q);

echo
"\nIstanze di classi di diversi spazi dei nomi e simili nomi di classe\n";
compareObjects($o, $r);
?>
L'esempio stampa:
Due istanze della stessa classe
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Due riferimenti alla stessa istanza
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Istanze di classi di diversi spazi dei nomi e simili nomi di classe
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Hosting by: hurra.com
Generated: 2007-01-26 17:56:36