Comparación de objetos

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&aacute;metros\n";
compararObjetos($o, $q);

echo
"\nComparar instancias creadas con par&aacute;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&aacute;metros
o1 == o2 : TRUE
o1 != o2 : FALSE
o1 === o2 : TRUE
o1 !== o2 : FALSE

Comparar instancias creadas con par&aacute;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

Hosting by: hurra.com
Generated: 2007-01-26 18:00:52