ci4

Форк
0
/
ReflectionHelper.php 
103 строки · 2.6 Кб
1
<?php
2

3
declare(strict_types=1);
4

5
/**
6
 * This file is part of CodeIgniter 4 framework.
7
 *
8
 * (c) CodeIgniter Foundation <admin@codeigniter.com>
9
 *
10
 * For the full copyright and license information, please view
11
 * the LICENSE file that was distributed with this source code.
12
 */
13

14
namespace CodeIgniter\Test;
15

16
use Closure;
17
use ReflectionClass;
18
use ReflectionException;
19
use ReflectionMethod;
20
use ReflectionObject;
21
use ReflectionProperty;
22

23
/**
24
 * Testing helper.
25
 */
26
trait ReflectionHelper
27
{
28
    /**
29
     * Find a private method invoker.
30
     *
31
     * @param object|string $obj    object or class name
32
     * @param string        $method method name
33
     *
34
     * @return Closure
35
     *
36
     * @throws ReflectionException
37
     */
38
    public static function getPrivateMethodInvoker($obj, $method)
39
    {
40
        $refMethod = new ReflectionMethod($obj, $method);
41
        $refMethod->setAccessible(true);
42
        $obj = (gettype($obj) === 'object') ? $obj : null;
43

44
        return static fn (...$args) => $refMethod->invokeArgs($obj, $args);
45
    }
46

47
    /**
48
     * Find an accessible property.
49
     *
50
     * @param object|string $obj
51
     * @param string        $property
52
     *
53
     * @return ReflectionProperty
54
     *
55
     * @throws ReflectionException
56
     */
57
    private static function getAccessibleRefProperty($obj, $property)
58
    {
59
        $refClass = is_object($obj) ? new ReflectionObject($obj) : new ReflectionClass($obj);
60

61
        $refProperty = $refClass->getProperty($property);
62
        $refProperty->setAccessible(true);
63

64
        return $refProperty;
65
    }
66

67
    /**
68
     * Set a private property.
69
     *
70
     * @param object|string $obj      object or class name
71
     * @param string        $property property name
72
     * @param mixed         $value    value
73
     *
74
     * @throws ReflectionException
75
     */
76
    public static function setPrivateProperty($obj, $property, $value)
77
    {
78
        $refProperty = self::getAccessibleRefProperty($obj, $property);
79

80
        if (is_object($obj)) {
81
            $refProperty->setValue($obj, $value);
82
        } else {
83
            $refProperty->setValue(null, $value);
84
        }
85
    }
86

87
    /**
88
     * Retrieve a private property.
89
     *
90
     * @param object|string $obj      object or class name
91
     * @param string        $property property name
92
     *
93
     * @return mixed value
94
     *
95
     * @throws ReflectionException
96
     */
97
    public static function getPrivateProperty($obj, $property)
98
    {
99
        $refProperty = self::getAccessibleRefProperty($obj, $property);
100

101
        return is_string($obj) ? $refProperty->getValue() : $refProperty->getValue($obj);
102
    }
103
}
104

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.