Forum und email

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:

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

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