Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there any way to set a private/protected static property using reflection classes?

I am trying to perform a backup/restore function for static properties of classes. I can get a list of all of the static properties and their values using the reflection objects getStaticProperties() method. This gets both private and public static properties and their values.

The problem is I do not seem to get the same result when trying to restore the properties with the reflection objects setStaticPropertyValue($key, $value) method. private and protected variables are not visible to this method as they are to getStaticProperties(). Seems inconsistent.

Is there any way to set a private/protected static property using reflection classes, or any other way for that matter?

TRIED

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(); 
like image 422
dqhendricks Avatar asked Jun 23 '11 02:06

dqhendricks


2 Answers

For accessing private/protected properties of a class we may need to set the accessibility of that class first, using reflection. Try the following code:

$obj         = new ClassName(); $refObject   = new ReflectionObject( $obj ); $refProperty = $refObject->getProperty( 'property' ); $refProperty->setAccessible( true ); $refProperty->setValue(null, 'new value'); 
like image 175
Shameer Avatar answered Oct 12 '22 10:10

Shameer


For accessing private/protected properties of a class, using reflection, without the need for a ReflectionObject instance:

For static properties:

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


For non-static properties:

<?php $instance = new SomeClassName(); $reflection = new \ReflectionProperty(get_class($instance), 'propertyName'); $reflection->setAccessible(true); $reflection->setValue($instance, 'new property value'); 
like image 21
Mihail H. Avatar answered Oct 12 '22 11:10

Mihail H.