Une Reflection permet de reverse-engineer des classes, méthodes, propriétés et fonctions.
Elle peut par exemple récupérer les commentaires d’une méthode ou accéder à des propriétés à priori non accessibles.
Une reflection peut être crée
à partir d’un nom de classe
<?php
$r = new ReflectionClass('Example');
ou d’un objet
<?php
$r = new ReflectionObject($obj);
Permet de créer un objet d’une classe donnée sans appeler son constructeur.
<?php
$r = new ReflectionClass('Example');
$obj = $r->newInstanceWithoutConstructor();
print_r($obj);
Retourne les commentaires de la classe.
<?php
echo $r->getDocComment(); # /** * Classe B */
getProperties
retourne la liste des propriétés de la classe, statiques et non statiques
(liste de ReflectionProperty
).
<?php
interface I {}
/**
* Classe abstraite A
*/
abstract class A {
/**
* Test
* @return string
*/
public function test() { return 'A'; }
}
/**
* Classe B
*/
class B extends A implements I {
const CONST = "VALUE";
public static $staticVar = "B";
protected $var = "b";
}
$r = new ReflectionClass("B");
print_r($r->getProperties());
/* Array (
[0] => ReflectionProperty Object ( [name] => staticVar [class] => B )
[1] => ReflectionProperty Object ( [name] => var [class] => B ) )
*/
getStaticProperties
retourne la liste des propriétés statiques de la classe
(leur nom associé à leur valeur).
<?php
print_r($r->getStaticProperties());
/* Array (
[staticVar] => B
) */
getStaticPropertyValue
récupère la valeur d’une propriété statique.
<?php
echo $r->getStaticPropertyValue('staticVar'); # B
setStaticPropertyValue
modifie la valeur d’une propriété statique.
<?php
$r->setStaticPropertyValue('staticVar', 'HELLO');
echo B::$staticVar; # HELLO
Retourne la liste des constantes de la classe (leur nom associé à leur valeur).
<?php
print_r($r->getConstants();
# Array ( [CONST] => VALUE )
Retourne la liste des méthodes de la classe (liste de ReflectionMethod
).
<?php
print_r($r->getMethods();
/* Array (
[0] => ReflectionMethod Object ( [name] => test [class] => A ))
*/
Vérifie respectivement si une propriété, constante ou propriété donnée existe.
<?php
echo $r->hasProperty('var') ? 'Y' : 'N'; # Y
<?php
echo $r->hasConstant('CONST') ? 'Y' : 'N'; # Y
<?php
echo $r->hasMethod('hello') ? 'Y' : 'N'; # Y
Vérifie respectivement s’il s’agit d’une classe abstraite ou finale.
<?php
echo $r->isAbstract() ? 'Y' : 'N'; # N
<?php
echo $r->isFinal() ? 'Y' : 'N'; # N
Retourne la classe parente ou false
.
<?php
echo $r->getParentClass(); # ReflectionClass Object ( [name] => A )
Vérifie si la classe hérite ou implémente la classe donnée.
<?php
echo $r->isSubclassOf('A') ? 'Y' : 'N'; # Y
echo $r->isSubclassOf('I') ? 'Y' : 'N'; # Y
Vérifie si la classe est une interface.
<?php
echo $r->isInterface() ? 'Y' : 'N'; # N
Vérifie si la classe implémente l’interface donnée.
<?php
echo $r->implementsInterface('I') ? 'Y' : 'N'; # Y
getInterfaces
retourne la liste des interfaces que la classe implémente (liste d’objets Reflection
)
<?php
print_r($r->getInterfaces());
/* Array (
[I] => ReflectionClass Object ( [name] => I ) )
*/
getInterfaceNames
retourne les noms (chaîne de caractères).
<?php
print_r($r->getInterfaceNames(); # Array ( [0] => I )
Il existe deux manières de récupérer une reflection de propriété
à partir du nom de classe
<?php
$rp = new ReflectionProperty('B', 'var');
à partir d’un objet ReflectionClass
<?php
$rp = $r->getProperty('var');
Retourne le nom de la propriété.
<?php
echo $rp->getName(); # var
Retourne la valeur de la propriété pour un objet donné.
L’objet en paramètre peut être omis pour récupérer la valeur d’une propriété statique.
<?php
echo $rp->getValue($obj);
Rend la propriété publique pour la reflection en cours.
Permet de récupérer la valeur d’une propriété d’un objet qui n’est pas publique.
<?php
$rp = new ReflectionProperty('B', 'var');
$rp->setAccessible(true);
print_r($rp->getValue($obj)); # b
<?php
$r = new ReflectionObject($obj);
$rp = $r->getProperty('var');
$rp->setAccessible(true);
print_r($rp->getValue($obj));
Vérifie respectivement si la propriété est publique, protégée ou privée.
<?php
echo $rp->isPublic() ? 'Y' : 'N'; # N
<?php
echo $rp->isProtected() ? 'Y' : 'N'; # Y
<?php
echo $rp->isPrivate() ? 'Y' : 'N'; " N
Vérifie si la propriété est statique.
<?php
echo $rp->isStatic() ? 'Y' : 'N'; # N
De la même manière que pour les propriétés, on peut récupérer une reflection de méthode
à partir du nom de classe
<?php
$rm = new ReflectionMethod('B', 'test');
à partir d’un objet ReflectionClass
<?php
$rm = $r->getMethod('test');
Retourne les commentaires de la méthode.
<?php
echo $rm->getDocComment();
# /** * Test * @return string */
Rend la méthode publique pour la reflection en cours.
<?php
$rm->setAccessible(true);
Appelle la méthode sur l’objet donné.
invoke
prend une liste d’argument, séparés par des virgules, tandis que invokeArgs
prend un tableau.
<?php
$rm->invoke($obj, 1, 2);
<?php
$rm->invokeArgs($obj, array(1, 2));
Vérifie respectivement si la méthode est publique, protégée ou privée.
<?php
echo $rm->isPublic() ? 'Y' : 'N'; # Y
<?php
echo $rm->isProtected() ? 'Y' : 'N'; # N
<?php
echo $rm->isPrivate() ? 'Y' : 'N'; # Y
Vérifie si la méthode est statique.
<?php
echo $rm->isStatic() ? 'Y' : 'N'; # N
Vérifie respectivement si la méthode est abstraite ou finale.
<?php
echo $rm->isAbstract() ? 'Y' : 'N'; # N
<?php
echo $rm->isFinal() ? 'Y' : 'N'; # N
Vérifie respectivement si la méthode est le constructeur ou le destructeur de la classe.
<?php
echo $rm->isConstructor() ? 'Y' : 'N'; # N
<?php
echo $rm->isDestructor() ? 'Y' : 'N'; # N