Thứ Bảy, 13 tháng 4, 2013

So sánh class php dùng reflection

Đây là class các bạn dùng:
<?php
class compareobject
{
public static function compareobjects($obj1,$obj2)
{
$resultado = false;
//creo los objetos basados en ReflectionClass
$refObj1 = new ReflectionClass($obj1);
$refObj2 = new ReflectionClass($obj2);
//voy a comparar si ambos objetos tienen el mismo nombre de clase
if($refObj1->getName()==$refObj2->getName() )
{
//obtengo las propiedades de cada uno de los objetos
$aProp1=$refObj1->getProperties();
$aProp2=$refObj2->getProperties();
//voy a iterar entre todas las propiedades de los objetos
//como ya determine que ambos son de la misma clase
//ambos tienen la misma cantidad de propiedades
for($k=0;$k<sizeof($aProp2);$k++)
{
//si la propiedad es privada la coloco como accesible
if($aProp1[$k]->isPrivate())
{
$aProp1[$k]->setAccessible(true);
$aProp2[$k]->setAccessible(true);
}
//si la propiedad es protegida la coloco como accesible
if($aProp1[$k]->isProtected())
{
$aProp1[$k]->setAccessible(true);
$aProp2[$k]->setAccessible(true);
}
//comparo ambos valores
if($aProp1[$k]->getValue($obj1)==$aProp2[$k]->getValue($obj2))
$resultado = true;
else
{
//si una de las propiedades no es igual en ambos objetos
//termino el for
$resultado=false;
break 1;
}
}
}
else
$resultado = false;
return $resultado ;
}
}
?>

Cách dùng rất đơn giản:
<?php
include('compareobject.php');
class class1
{
private $x;
private $y;

function __set($propiedad,$valor)
{
$this->$propiedad=$valor;
}
function __get($propiedad)
{
return $this->$propiedad;
}
}

$object1=new class1();
$object1->x=10;
$object1->y=20;

$object2=new class1();
$object2->x=10;
$object2->y=20;

$object3=new class1();
$object3->x=10;
$object3->y=10;
if(compareobject::compareobjects($object1,$object2))
{
echo "The OBJECT 1: \n";
print_r($object1);
echo "\nIs Equal to \n"; //print 1
echo "The OBJECT 2: \n";
print_r($object2);
echo "\n";
echo "\n";
echo "\n";
}
if(!compareobject::compareobjects($object1,$object3))
{
echo "The OBJECT 1: \n";
print_r($object1);
echo "\nIs not equal to \n"; //print 1
echo "The OBJECT 3: \n";
print_r($object3);
}

?>