88 lines
2.0 KiB
PHP
88 lines
2.0 KiB
PHP
<?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);
|
|
}
|
|
}
|