Skip to content

Instantly share code, notes, and snippets.

@fepalener
Forked from Ocramius/Foo.php
Created December 5, 2017 20:31
Show Gist options
  • Select an option

  • Save fepalener/008cd30b65cde64833510f99bbe6a014 to your computer and use it in GitHub Desktop.

Select an option

Save fepalener/008cd30b65cde64833510f99bbe6a014 to your computer and use it in GitHub Desktop.
Self hydrating object proxy in PHP Provides faster hydration by removing the need for reflection.

This piece of code tries to reduce the performance overhead needed to populate an object's properties via reflection.

An example of its usage can be found at http://3v4l.org/he2dF

<?php
class Foo
{
protected $foo;
protected $bar;
protected $baz;
}
<?php
class FooSelfHydratingProxy extends Foo implements HydratorInterface
{
/** zero-argument constructor since this is just a helper class for hydration */
public function __construct()
{
}
/**
* the `Foo` typehint is not part of the interface - here only for the sake of readability/clearness
*/
public function hydrate($data, Foo $object)
{
$object->foo = $data['foo'];
$object->bar = $data['bar'];
$object->baz = $data['baz'];
}
/**
* the `Foo` typehint is not part of the interface - here only for the sake of readability/clearness
*/
public function extract(Foo $object)
{
return array('foo' => $object->foo, 'bar' => $object->bar, 'baz' => $object->baz);
}
}
<?php
$iterations = 100000;
class A {protected $a; protected $b; protected $c;}
class AHydrator extends A {
public function hydrate(A $a, array $data)
{
$a->a = $data['a'];
$a->b = $data['b'];
$a->c = $data['c'];
}
}
$data = array('a' => 1, 'b' => 2, 'c' => 3);
$a = new A();
$h = new AHydrator();
for ($i = 0; $i < $iterations; $i++) {
$h->hydrate($a, $data);
}
<?php
$iterations = 100000;
class A {protected $a; protected $b; protected $c;}
$rA = new ReflectionProperty('A', 'a');
$rB = new ReflectionProperty('A', 'b');
$rC = new ReflectionProperty('A', 'c');
$rA->setAccessible(true);
$rB->setAccessible(true);
$rC->setAccessible(true);
$data = array('a' => 1, 'b' => 2, 'c' => 3);
$a = new A();
for ($i = 0; $i < $iterations; $i++) {
$rA->setValue($a, $data['a']);
$rB->setValue($a, $data['b']);
$rC->setValue($a, $data['c']);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment