Beware, the Reflection reflects only the information right after compile time based on the definitions, not based on runtime objects. Might be obvious, wasn't for me, until the app throws the exception at my head.
Example:
<?php
class A {
public $a = null;
function set() {
$this->foo = 'bar';
}
}
$a = new A;
$a->set();
// works fine
$Reflection = new ReflectionProperty($a, 'a');
// throws exception
$Reflection = new ReflectionProperty($a, 'foo');
?>
La classe ReflectionProperty
(PHP 5)
Introduction
La classe ReflectionProperty rapporte des informations sur les propriétés des classes.
Synopsis de la classe
Propriétés
- name
-
Nom de la propriété. En lecture seule, émets une exception de type ReflectionException si l'on tente d'y écrire.
- class
-
Nom de la classe où la propriété a été définie. En lecture seule, émets une exception de type ReflectionException si l'on tente d'y écrire.
Constantes pré-définies
Modificateurs de ReflectionProperty
Sommaire
- ReflectionProperty::__clone — Clonage
- ReflectionProperty::__construct — Construit un nouvel objet ReflectionProperty
- ReflectionProperty::export — Exporte
- ReflectionProperty::getDeclaringClass — Récupère la classe déclarante
- ReflectionProperty::getDocComment — Récupère un commentaire
- ReflectionProperty::getModifiers — Récupère les modificateurs
- ReflectionProperty::getName — Récupère le nom de la proriété
- ReflectionProperty::getValue — Récupère la valeur de la propriété
- ReflectionProperty::isDefault — Vérifie si la propriété est celle par défaut
- ReflectionProperty::isPrivate — Vérifie si la propriété est statique
- ReflectionProperty::isProtected — Vérifie si la propriété est protégée
- ReflectionProperty::isPublic — Vérifie si la propriété est publique
- ReflectionProperty::isStatic — Vérifie si la propriété est statique
- ReflectionProperty::setAccessible — Définit l'accessibilité de la propriété
- ReflectionProperty::setValue — Définit la valeur de la propriété
- ReflectionProperty::__toString — Récupère une représentation textuelle
CodeDuck at gmx dot net ¶
7 years ago
james at digitaledgeit dot com dot au ¶
2 years ago
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!
rasmus at mindplay dot dk ¶
2 years ago
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...
james at digitaledgeit dot com dot au ¶
2 years ago
You CAN reflect an object at runtime:
<?php
class Abc {
private $_abc = 123;
public function __construct($abc) {
$this->_abc = $abc;
}
}
$obj = new Abc('def');
$refl = new \ReflectionObject($obj);
$prop = $refl->getProperty('_abc');
$prop->setAccessible(true);
echo $prop->getValue($obj);
?>
This outputs 'def', the value of _abc set at runtime.
