mirror of
https://github.com/doctrine/persistence.git
synced 2026-03-23 22:42:11 +01:00
114 lines
2.7 KiB
PHP
114 lines
2.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Doctrine\Persistence\Mapping;
|
|
|
|
use Doctrine\Persistence\Reflection\RuntimePublicReflectionProperty;
|
|
use Doctrine\Persistence\Reflection\TypedNoDefaultReflectionProperty;
|
|
use ReflectionClass;
|
|
use ReflectionException;
|
|
use ReflectionMethod;
|
|
use ReflectionProperty;
|
|
|
|
use function array_key_exists;
|
|
use function assert;
|
|
use function class_exists;
|
|
use function class_parents;
|
|
use function phpversion;
|
|
use function version_compare;
|
|
|
|
/**
|
|
* PHP Runtime Reflection Service.
|
|
*/
|
|
class RuntimeReflectionService implements ReflectionService
|
|
{
|
|
/** @var bool */
|
|
private $supportsTypedPropertiesWorkaround;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->supportsTypedPropertiesWorkaround = version_compare((string) phpversion(), '7.4.0') >= 0;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function getParentClasses(string $class)
|
|
{
|
|
if (! class_exists($class)) {
|
|
throw MappingException::nonExistingClass($class);
|
|
}
|
|
|
|
$parents = class_parents($class);
|
|
|
|
assert($parents !== false);
|
|
|
|
return $parents;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function getClassShortName(string $class)
|
|
{
|
|
$reflectionClass = new ReflectionClass($class);
|
|
|
|
return $reflectionClass->getShortName();
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function getClassNamespace(string $class)
|
|
{
|
|
$reflectionClass = new ReflectionClass($class);
|
|
|
|
return $reflectionClass->getNamespaceName();
|
|
}
|
|
|
|
/**
|
|
* @psalm-param class-string<T> $class
|
|
*
|
|
* @return ReflectionClass<T>
|
|
*
|
|
* @template T of object
|
|
*/
|
|
public function getClass(string $class)
|
|
{
|
|
return new ReflectionClass($class);
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function getAccessibleProperty(string $class, string $property)
|
|
{
|
|
$reflectionProperty = new ReflectionProperty($class, $property);
|
|
|
|
if ($reflectionProperty->isPublic()) {
|
|
$reflectionProperty = new RuntimePublicReflectionProperty($class, $property);
|
|
} elseif ($this->supportsTypedPropertiesWorkaround && ! array_key_exists($property, $this->getClass($class)->getDefaultProperties())) {
|
|
$reflectionProperty = new TypedNoDefaultReflectionProperty($class, $property);
|
|
}
|
|
|
|
$reflectionProperty->setAccessible(true);
|
|
|
|
return $reflectionProperty;
|
|
}
|
|
|
|
/**
|
|
* {@inheritDoc}
|
|
*/
|
|
public function hasPublicMethod(string $class, string $method)
|
|
{
|
|
try {
|
|
$reflectionMethod = new ReflectionMethod($class, $method);
|
|
} catch (ReflectionException $e) {
|
|
return false;
|
|
}
|
|
|
|
return $reflectionMethod->isPublic();
|
|
}
|
|
}
|