web-dev-qa-db-fra.com

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

J'essaie d'exécuter une fonction de sauvegarde/restauration pour les propriétés statiques des classes. Je peux obtenir une liste de toutes les propriétés statiques et leurs valeurs en utilisant la méthode getStaticProperties() des objets de réflexion. Ceci obtient les propriétés private et public static Et leurs valeurs.

Le problème est que je ne semble pas obtenir le même résultat en essayant de restaurer les propriétés avec la méthode setStaticPropertyValue($key, $value) des objets de réflexion. Les variables private et protected ne sont pas visibles pour cette méthode comme elles le sont pour getStaticProperties(). Semble incohérent.

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

A 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();
57
dqhendricks

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

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

Pour accéder aux propriétés privées/protégées d'une classe, en utilisant la réflexion, sans avoir besoin d'une instance ReflectionObject:

Pour les propriétés statiques:

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


Pour les propriétés non statiques:

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