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