-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReflectionUtil.php
More file actions
95 lines (85 loc) · 2.68 KB
/
ReflectionUtil.php
File metadata and controls
95 lines (85 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
namespace Oro\Component\Testing;
use Oro\Component\PhpUtils\ReflectionUtil as PhpReflectionUtil;
/**
* Provides utility static methods to help working with reflection in tests.
*/
class ReflectionUtil
{
/**
* Sets the ID value to the given entity.
*
* @param object $entity
* @param mixed $id
*/
public static function setId(object $entity, $id): void
{
self::setPropertyValue($entity, 'id', $id);
}
/**
* Sets the given value to the given protected/private property.
*
* @param object $object
* @param string $propertyName
* @param mixed $propertyValue
*/
public static function setPropertyValue(object $object, string $propertyName, $propertyValue): void
{
$property = self::getProperty(new \ReflectionClass($object), $propertyName);
$property->setAccessible(true);
$property->setValue($object, $propertyValue);
}
/**
* Gets a value of the given protected/private property.
*
* @param object $object
* @param string $propertyName
*
* @return mixed
*/
public static function getPropertyValue(object $object, string $propertyName)
{
$property = self::getProperty(new \ReflectionClass($object), $propertyName);
$property->setAccessible(true);
return $property->getValue($object);
}
/**
* Calls a protected/private method of the given object.
*
* @param object $object
* @param string $methodName
* @param array $args
*
* @return mixed
*/
public static function callMethod(object $object, string $methodName, array $args)
{
$reflClass = new \ReflectionClass($object);
try {
$method = $reflClass->getMethod($methodName);
} catch (\ReflectionException $e) {
throw new \LogicException(sprintf(
'The method "%s" does not exist in the class "%s".',
$methodName,
$reflClass->getName()
), $e->getCode(), $e);
}
$method->setAccessible(true);
return $method->invokeArgs($object, $args);
}
/**
* Finds a property in a given class or any of its superclasses.
*/
private static function getProperty(\ReflectionClass $reflClass, string $propertyName): \ReflectionProperty
{
$property = PhpReflectionUtil::getProperty($reflClass, $propertyName);
if (null === $property) {
throw new \LogicException(sprintf(
'The property "%s" does not exist in the class "%s".',
$propertyName,
$reflClass->getName()
));
}
return $property;
}
}