Estoy tratando de 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 private
y public static
y sus valores.¿Hay alguna manera de establecer una propiedad estática privada/protegida utilizando clases de reflexión?
El problema es que no parece obtener el mismo resultado cuando trato de restaurar las propiedades con el método setStaticPropertyValue($key, $value)
de los objetos de reflexión. private
y protected
variables 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?
INTENTARON
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();
Esto es bastante correcto, probablemente también quiera usar '$ refProperty-> setValue (null, 'new value');' para establecer el nuevo valor de la variable. – tplaner
Gracias @evolve. No funcionaba hasta que usé setValue(). ¡Gracias! – dqhendricks
@dqhendricks no hay problema, buena pregunta. – tplaner