<?php
function object_diff($source, $target)
{
if (!is_object($source) || !is_object($target) || !($source instanceof $target))
{
return null;
}
$sourceReflection = new ReflectionObject($source);
$targetReflection = new ReflectionObject($target);
$sourceProperties = array_map(function (ReflectionProperty $property) use ($source) {
$property->setAccessible(true);
return $property->getValue($source);
}, $sourceReflection->getProperties());
$targetProperties = array_map(function (ReflectionProperty $property) use ($target) {
$property->setAccessible(true);
return $property->getValue($target);
}, $targetReflection->getProperties());
return array_diff($sourceProperties, $targetProperties);
}
class Foo
{
private $a, $b, $c;
public function __construct($a, $b, $c)
{
$this->a = $a;
$this->c = $b;
$this->b = $b;
}
}
$foo1 = new Foo('a', 'b', 'c');
$foo2 = new Foo('a', 'b', 'd');
var_dump(object_diff($foo1, $foo2));
preferences:
36.78 ms | 402 KiB | 5 Q