2011-06-23 7 views
50

Próbuję wykonać funkcję kopii zapasowej/przywracania dla właściwości statycznych klas. Mogę uzyskać listę wszystkich właściwości statycznych i ich wartości za pomocą metody odbicia obiektów getStaticProperties(). Obejmuje to zarówno właściwości, jak i ich wartości: private i.Czy istnieje sposób na ustawienie prywatnej/chronionej właściwości statycznej za pomocą klas odbicia?

Problem polega na tym, że wydaje mi się, że nie uzyskujemy tego samego wyniku, gdy próbujemy przywrócić właściwości za pomocą metody odbicia obiektów setStaticPropertyValue($key, $value). Zmienne private i protected nie są widoczne dla tej metody, ponieważ są one dla getStaticProperties(). Wydaje się niespójne.

Czy istnieje sposób na ustawienie prywatnej/chronionej właściwości statycznej za pomocą klas odbicia lub w jakikolwiek inny sposób?

SPRAWDZONE

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

Odpowiedz

65

dostępu do prywatnych/protected właściwości klasy mogą musimy ustawić dostępności tej klasy pierwszej, przy użyciu odbicia. Spróbuj następującego kodu:

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

To jest całkiem poprawne, prawdopodobnie również chcesz użyć '$ refProperty-> setValue (null, 'new value');', aby ustawić nową wartość zmiennej. – tplaner

+0

Dziękuję @evolve. Nie działało, dopóki nie użyłem setValue(). Dzięki! – dqhendricks

+0

@dqhendricks bez problemu, dobre pytanie. – tplaner

33

dostępu do prywatnych/protected właściwości klasy, przy użyciu odbicia, bez potrzeby dla ReflectionObject przykład:

Dla właściwości statycznych:

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


W przypadku właściwości niestatycznych:

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

'ReflectionProperty :: setValue() oczekuje, że parametr 1 będzie obiektem, null given' Twoja odpowiedź ma ten sam problem co ja z @ Shamee'a – ThorSummoner

+1

To z pewnością działa w PHP 5.6, a dokumentacja sugeruje, że to było zawsze jak powinien działać (patrz: http://php.net/manual/en/reflectionproperty.setvalue.php), więc nie wiesz, dlaczego to nie zadziałało dla @ThorSummoner – DanielM

Powiązane problemy