PHPKonf İstanbul PHP Conference 2015

Comparando objetos

No PHP 4, objetos são comparados de uma maneira muito simples, isto é: Duas instâncias de objectos são iguais caso eles possuem os mesmos atributos e valores, e são instâncias da mesma classe. Regras similares são aplicadas quando comparamos dois objetos usando o operador de identidade (===).

Se executássemos o código no exemplo abaixo:

Exemplo #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 
"Compara instâncias criadas com os mesmos parâmetros\n";
compareObjects($o$q);

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

echo 
"\nCompara uma instância da classe pai e outra da classe filha\n";
compareObjects($o$r);
?>

O exemplo acima irá imprimir:

    
Compara instâncias criadas com os mesmos parâmetros
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

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

Compara uma instância da classe pai e outra da classe filha
o1 == o2 : FALSE
o1 != o2 : TRUE
o1 === o2 : FALSE
o1 !== o2 : TRUE
Este é a saída esperada de acordo com as regras de comparação explicadas acima. Apenas instâncias com o mesmo valor para seus atributos e que são da mesma classe são considerados iguais e identicos.

As mesmas regras de comparação são aplicadas também no caso de possuirmos composição de objetos. No exemplo abaixo, criamos uma classe "container" que armazena um array associativo de objetos do tipo Flag.

Exemplo #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 
"\nComparação entre os 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:

Comparação entre os 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

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top