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:
Ejemplo 18-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 |
|
Que es la salida que podemos esperar dadas las reglas de
comparación descritas anteriormente. Solo las instancias con
los mismos valores para sus atributos y de la misma clase son
consideradas iguales e idénticas.
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.
Ejemplo 18-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 |
|