Есть ли способ установить закрытое / защищенное статическое свойство, используя классы отражения? - PullRequest
56 голосов
/ 23 июня 2011

Я пытаюсь выполнить функцию резервного копирования / восстановления статических свойств классов. Я могу получить список всех статических свойств и их значений с помощью метода объектов отражения 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 ]

75 голосов
/ 23 июня 2011

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

$obj         = new ClassName();
$refObject   = new ReflectionObject( $obj );
$refProperty = $refObject->getProperty( 'property' );
$refProperty->setAccessible( true );
$refProperty->setValue(null, 'new value');
37 голосов
/ 07 ноября 2012

Для доступа к закрытым / защищенным свойствам класса, используя отражение, без необходимости 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...