Есть ли способ установить частное/защищенное статическое свойство с помощью классов отражения?
Я пытаюсь выполнить функцию резервного копирования / восстановления для статических свойств классов. Я могу получить список всех статических свойств и их значений, используя объекты отражения 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 ответа:
для доступа к закрытым / защищенным свойствам класса нам может потребоваться сначала установить доступность этого класса, используя отражение. Попробуйте следующий код:
$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');