Есть ли способ установить частное/защищенное статическое свойство с помощью классов отражения?


Я пытаюсь выполнить функцию резервного копирования / восстановления для статических свойств классов. Я могу получить список всех статических свойств и их значений, используя объекты отражения getStaticProperties() метод. Это получает оба private и public static свойства и их значения.

проблема в том, что я, кажется, не получаю тот же результат при попытке восстановить свойства с помощью объектов отражения setStaticPropertyValue($key, $value) метод. private и protected переменные не видны к этому методу, так как они должны getStaticProperties(). Кажется непоследовательным.

есть ли способ установить частное/защищенное статическое свойство с помощью классов отражения или любым другим способом?

пробовал

class Foo {
    static public $test1 = 1;
    static protected $test2 = 2;

    public function test () {
        echo self::$test1 . '<br>';
        echo self::$test2 . '<br><br>';
    }

    public function change () {
        self::$test1 = 3;
        self::$test2 = 4;
    }
}

$test = new foo();
$test->test();

// Backup
$test2 = new ReflectionObject($test);
$backup = $test2->getStaticProperties();

$test->change();

// Restore
foreach ($backup as $key => $value) {
    $property = $test2->getProperty($key);
    $property->setAccessible(true);
    $test2->setStaticPropertyValue($key, $value);
}

$test->test();
2 53

2 ответа:

для доступа к закрытым / защищенным свойствам класса нам может потребоваться сначала установить доступность этого класса, используя отражение. Попробуйте следующий код:

$obj         = new ClassName();
$refObject   = new ReflectionObject( $obj );
$refProperty = $refObject->getProperty( 'property' );
$refProperty->setAccessible( true );
$refProperty->setValue(null, 'new value');

для доступа к закрытым / защищенным свойствам класса, используя отражение, без необходимости ReflectionObject например:

для статической свойства:

<?php
$reflection = new \ReflectionProperty('ClassName', 'propertyName');
$reflection->setAccessible(true);
$reflection->setValue(null, 'new property value');


Для нестатических свойств:

<?php
$instance = New SomeClassName();
$reflection = new \ReflectionProperty(get_class($instance), 'propertyName');
$reflection->setAccessible(true);
$reflection->setValue($instance, 'new property value');