Forum und email

Comparando Objetos

No PHP 4, objetos são comparados de uma maneira bem simples: Duas instâncias de objetos são iguais se eles tem os mesmos atributos e valores, e se de instâncias da mesma classe. Regras similares são aplicadas quando comparando dois objetos utilizando o operador idêntico (===).

Executando o exemplo abaixo:

Example#1 Exemplo de comparação de objetos no PHP 4

<?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;
    }
}

class 
SwitchableFlag extends Flag {

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

    function 
turnOff() {
        
$this->flag false;
    }
}

$o = new Flag();
$p = new Flag(false);
$q = new Flag();

$r = new SwitchableFlag();

echo 
"Comparando instâncias criadas com os mesmo parâmetros\n";
compareObjects($o$q);

echo 
"\nComparando instâncias criadas com parâmetros diferentes\n";
compareObjects($o$p);

echo 
"\nComparando instâncias de uma classe base com uma classe estendida\n";
compareObjects($o$r);
?>

O exemplo acima irá imprimir:

Comparando instâncias criadas com os mesmo parâmetros
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Comparando instâncias criadas com parâmetros diferentes
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE

Comparando instâncias de uma classe base com uma classe estendida
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
Que é o resultado que esperava-mos obter pelas regras de comparação acima. Somente instâncias com os mesmos valores de seus atributos e da mesma classe são considerados iguais e/ou idênticos.

Mesmo no caso onde temos composição de objetos, as mesmas regras de comparação se aplicam. No exemplo abaixo, nós criamos uma classe container que preserva um array associativo de objetos Flag.

Example#2 Comparação de objetos compostos no PHP 4

<?php
class FlagSet {
    var 
$set;

    function 
FlagSet($flagArr = array()) {
        
$this->set $flagArr;
    }

    function 
addFlag($name$flag) {
        
$this->set[$name] = $flag;
    }

    function 
removeFlag($name) {
        if (
array_key_exists($name$this->set)) {
            unset(
$this->set[$name]);
        }
    }
}


$u = new FlagSet();
$u->addFlag('flag1'$o);
$u->addFlag('flag2'$p);
$v = new FlagSet(array('flag1'=>$q'flag2'=>$p));
$w = new FlagSet(array('flag1'=>$q));

echo 
"\nComparando objetos compostos u(o,p) e v(q,p)\n";
compareObjects($u$v);

echo 
"\nu(o,p) e w(q)\n";
compareObjects($u$w);
?>

O exemplo acima irá imprimir:

Comparando objetos compostos u(o,p) e v(q,p)
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

u(o,p) e w(q)
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE