Intereting Posts
альтернатива xajax? Модуль авторизации Kohana 3, получение пользователей с ролью «персонал» или «менеджер» Регулярное выражение для удаления чего-либо, кроме буквенно-цифровых и пробелов (в PHP) Как преобразовать десятичную дробь во времени, например. НН: ММ: СС paginator call on query builder не возвращает объект paginator в laravel 4 (в конкретном случае) Редакторы PHP для Ubuntu Facebook php app продолжает цикл в IE, есть ли исправление на стороне сервера? Конфигурация phpMyAdmin Ошибка 324 пустой ответ на приложение, размещенное AWS mysqli_query () возвращает «Таблица не существует» для известной таблицы – Разрешения выдаются? Как сгенерировать «скриншот» html div с внешними изображениями? Перегрузка метода PHP 5.3 (как в Java) Передача ключей массива и значений в строку запроса Mysql Как переписать директиву на apache для привязки cms Ошибка входа в систему Google Php Oauth Не удалось найти системный пакет CA

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

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

Проблема в том, что, похоже, я не получаю такой же результат при попытке восстановить свойства с помощью объектов setStaticPropertyValue($key, $value) объектов 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(); 

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

     $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');