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