En PHP 4, los objetos son comparados en una forma muy simple: Dos instancias de objeto son iguales si tienen los mismos atributos y valores, y son instancias de la misma clase. Reglas similares se aplican cuando se comparan dos objetos usando el operador de identidad (===).
Si ejecutáramos el código del siguiente ejemplo:
Example#1 Ejemplo de comparación de objetos en PHP 4
<?php
function bool_a_cadena($bool) {
if ($bool === false) {
return 'FALSE';
} else {
return 'TRUE';
}
}
function compararObjetos(&$o1, &$o2) {
echo 'o1 == o2 : '.bool_a_cadena($o1 == $o2)."\n";
echo 'o1 != o2 : '.bool_a_cadena($o1 != $o2)."\n";
echo 'o1 === o2 : '.bool_a_cadena($o1 === $o2)."\n";
echo 'o1 !== o2 : '.bool_a_cadena($o1 !== $o2)."\n";
}
class Bandera {
var $bandera;
function Bandera($bandera=true) {
$this->bandera = $bandera;
}
}
class BanderaCambiante extends Bandera {
function encender() {
$this->bandera = true;
}
function apagar() {
$this->bandera = false;
}
}
$o = new Bandera();
$p = new Bandera(false);
$q = new Bandera();
$r = new BanderaCambiante();
echo "Comparar instancias creadas con los mismos parámetros\n";
compararObjetos($o, $q);
echo "\nComparar instancias creadas con parámetros diferentes\n";
compararObjetos($o, $p);
echo "\nComparar una instancia de una clase padre con una de una subclase\n";
compararObjetos($o, $r);
?>
El resultado del ejemplo seria:
Comparar instancias creadas con los mismos parámetros o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE Comparar instancias creadas con parámetros diferentes o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE Comparar una instancia de una clase padre con una de una subclase o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE
Incluso en los casos en donde tenemos composición de objetos, se aplican las mismas reglas de comparación. En el ejemplo siguiente creamos una clase contenedora que almacena una matriz asociativa de objetos Bandera.
Example#2 Comparación de objetos compuestos en PHP 4
<?php
class ConjuntoBanderas {
var $conjunto;
function ConjuntoBanderas($matrizBanderas = array()) {
$this->conjunto = $matrizBanderas;
}
function agregarBandera($nombre, $bandera) {
$this->conjunto[$nombre] = $bandera;
}
function eliminarBandera($nombre) {
if (array_key_exists($nombre, $this->conjunto)) {
unset($this->conjunto[$nombre]);
}
}
}
$u = new ConjuntoBanderas();
$u->agregarBandera('bandera1', $o);
$u->agregarBandera('bandera2', $p);
$v = new ConjuntoBanderas(array('bandera1'=>$q, 'bandera2'=>$p));
$w = new ConjuntoBanderas(array('bandera1'=>$q));
echo "\nObjetos compuestos u(o,p) y v(q,p)\n";
compararObjetos($u, $v);
echo "\nu(o,p) y w(q)\n";
compararObjetos($u, $w);
?>
El resultado del ejemplo seria:
Objetos compuestos u(o,p) y v(q,p) o1 == o2 : TRUE o1 != o2 : FALSE o1 === o2 : TRUE o1 !== o2 : FALSE u(o,p) y w(q) o1 == o2 : FALSE o1 != o2 : TRUE o1 === o2 : FALSE o1 !== o2 : TRUE