<?php
function object_diff($source, $target)
{
if (!is_object($source) || !is_object($target) || !($source instanceof $target))
{
return null;
}
$sourceProperties = array();
$targetProperties = array();
$sourceReflection = new ReflectionObject($source);
$targetReflection = new ReflectionObject($target);
foreach ($sourceReflection->getProperties() as $sourceProperty)
{
$sourceProperty->setAccessible(true);
$sourceProperties[$sourceProperty->getName()] = $sourceProperty->getValue($source);
}
foreach ($targetReflection->getProperties() as $targetProperty)
{
$targetProperty->setAccessible(true);
$targetProperties[$targetProperty->getName()] = $targetProperty->getValue($target);
}
return array_diff_assoc($sourceProperties, $targetProperties);
}
class Foo
{
private $a, $b, $c;
public function __construct($a, $b, $c)
{
$this->a = $a;
$this->b = $b;
$this->c = $c;
}
}
$foo1 = new Foo('1', '2', '3');
$foo2 = new Foo('1', '3', '4');
var_dump(object_diff($foo1, $foo2));
preferences:
44.64 ms | 402 KiB | 5 Q