regular reflexión reflexion luz informatica especular difusa diferencias php reflection visibility

php - reflexion - ¿Hay alguna manera de establecer una propiedad estática privada/protegida utilizando clases de reflexión?



reflexion regular (2)

Estoy intentando realizar una función de copia de seguridad / restauración para las propiedades estáticas de las clases. Puedo obtener una lista de todas las propiedades estáticas y sus valores usando el método getStaticProperties() objetos de reflexión. Esto obtiene propiedades public static private y public static y sus valores.

El problema es que no parece obtener el mismo resultado cuando trato de restaurar las propiedades con el setStaticPropertyValue($key, $value) los objetos de reflexión. private variables private y protected no son visibles para este método como lo son para getStaticProperties() . Parece inconsistente.

¿Hay alguna manera de establecer una propiedad estática privada / protegida utilizando clases de reflexión, o de cualquier otra manera para ese asunto?

INTENTÓ

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();


Para acceder a las propiedades privadas / protegidas de una clase, es posible que tengamos que establecer la accesibilidad de esa clase primero, utilizando la reflexión. Pruebe el siguiente código:

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


Para acceder a las propiedades privadas / protegidas de una clase, utilizando la reflexión, sin la necesidad de una instancia de ReflectionObject :

Para propiedades estáticas:

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


Para propiedades no estáticas:

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