Please ignore my previous note. I didn't fully understand what the previous notes were referring to as "runtime". I now see they were referring to a slightly different question.
Apologies!
(PHP 5, PHP 7)
The ReflectionProperty class reports information about classes properties.
Name of the property. Read-only, throws ReflectionException in attempt to write.
Name of the class where the property is defined. Read-only, throws ReflectionException in attempt to write.
Please ignore my previous note. I didn't fully understand what the previous notes were referring to as "runtime". I now see they were referring to a slightly different question.
Apologies!
I think a more accurate explanation is this:
The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.
I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:
<?php
// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');
// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');
?>
Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.
In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.
Clearly this very useful library could use some real documentation...
<?php
//serialize static properties (class variable)
class Student {
private $members = array();
protected $name;
public static $noOfStudent;
public function __construct($name = 'Nanhe Kumar') {
$this->name = $name;
Student::$noOfStudent++;
}
public function __sleep() {
$vars = get_class_vars(get_class($this));
foreach ($vars as $key => $val) {
if (!empty($val))
$this->members[$key] = $val;
}
return array_keys(get_object_vars($this));
}
public function __wakeup() {
foreach ($this->members as $key => $val) {
$prop = new ReflectionProperty(get_class($this), $key);
$prop->setValue(get_class($this), $val);
}
$this->members = array();
}
public function getTotalStudent() {
return self::$noOfStudent;
}
}
$so1 = new Student();
$so2 = new Student();
$serialized = serialize($so1);
print_r($serialized); //O:7:"Student":2:{s:16:"Studentmembers";a:1:{s:11:"noOfStudent";i:2;}s:7:"*name";s:11:"Nanhe Kumar";}
$unserialized = unserialize($serialized);
print_r($unserialized); //Student Object ( [members:Student:private] => Array ( ) [name:protected] => Nanhe Kumar )
echo Student::$noOfStudent; //2
?>