66 votes

Existe-t-il un moyen de définir une propriété statique privée / protégée à l'aide de classes de réflexion?

Je suis en train d'effectuer une sauvegarde/restauration de la fonction de propriétés statiques de classes. Je peux obtenir une liste de toutes les propriétés statiques et leurs valeurs à l'aide de la réflexion des objets getStaticProperties() méthode. Cela devient à la fois private et public static propriétés et leurs valeurs.

Le problème c'est que je ne semble pas obtenir le même résultat lorsque vous essayez de restaurer les propriétés de la réflexion des objets setStaticPropertyValue($key, $value) méthode. Private et protected variables ne sont pas visibles à cette méthode, car ils sont à l' getStaticProperties(). Semble incohérent.

Est-il possible de définir un privé/protégé de propriété statique de l'aide de la réflexion de classes, ou de toute autre manière pour que la matière?

ESSAYÉ

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

85voto

Shameer Points 1730

Pour accéder aux propriétés privées / potentielles d'une classe, nous devrons peut-être d'abord définir l'accessibilité de cette classe, en utilisant la réflexion. Essayez le code donné

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

53voto

mkharitonov Points 375

Sans crée un objet de classe:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X