Manual do PHP
Anterior | Capítulo 13. Classes e Objetos | Próxima

# Comparação de objetos no PHP 4

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:

Exemplo 13-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); ?>`

Nós teremos:

    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.

Exemplo 13-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); ?>`

Que nos traz ao seguinte resultado:

    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

Anterior | Principal | Próxima
Referências dentro do construtor | Acima | Comparação de objetos no PHP 5