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
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