The start of something beautiful
This commit is contained in:
+87
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Doctrine\Persistence\Reflection;
|
||||
|
||||
use Doctrine\Common\Proxy\Proxy as CommonProxy;
|
||||
use Doctrine\Persistence\Proxy;
|
||||
use ReflectionProperty;
|
||||
use ReturnTypeWillChange;
|
||||
|
||||
use function ltrim;
|
||||
use function method_exists;
|
||||
|
||||
/**
|
||||
* PHP Runtime Reflection Property.
|
||||
*
|
||||
* Avoids triggering lazy loading if the provided object
|
||||
* is a {@see \Doctrine\Persistence\Proxy}.
|
||||
*/
|
||||
class RuntimeReflectionProperty extends ReflectionProperty
|
||||
{
|
||||
/** @var string */
|
||||
private $key;
|
||||
|
||||
/** @param class-string $class */
|
||||
public function __construct(string $class, string $name)
|
||||
{
|
||||
parent::__construct($class, $name);
|
||||
|
||||
$this->key = $this->isPrivate() ? "\0" . ltrim($class, '\\') . "\0" . $name : ($this->isProtected() ? "\0*\0" . $name : $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function getValue($object = null)
|
||||
{
|
||||
if ($object === null) {
|
||||
return parent::getValue($object);
|
||||
}
|
||||
|
||||
return ((array) $object)[$this->key] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* @param object|null $object
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function setValue($object, $value = null)
|
||||
{
|
||||
if (! ($object instanceof Proxy && ! $object->__isInitialized())) {
|
||||
parent::setValue($object, $value);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($object instanceof CommonProxy) {
|
||||
$originalInitializer = $object->__getInitializer();
|
||||
$object->__setInitializer(null);
|
||||
|
||||
parent::setValue($object, $value);
|
||||
|
||||
$object->__setInitializer($originalInitializer);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (! method_exists($object, '__setInitialized')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$object->__setInitialized(true);
|
||||
|
||||
parent::setValue($object, $value);
|
||||
|
||||
$object->__setInitialized(false);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user