Comparación de objetos

En PHP, 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
<?phpfunction 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
<?phpclass 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

No response to “Comparación de objetos”