Réfléxivité

1 h Niveau 8

Dans le développement de logiciels, le terme "réflexion" signifie qu'un programme connaît sa propre structure au moment de l'exécution et qu'il peut également la modifier. Cette capacité est également appelée "introspection". Dans le domaine PHP, Reflection est utilisé pour garantir la sécurité des types dans le code de programme.

Exemple

Préparons une classe d'exemple simple :

class Example {

    private $attribute1;

    protected $attribute2;

    public $attribute3;

    const PI = 3.1415;

    public function __construct() {
        $this->attribute1 = "Lorem ipsum";
        $this->attribute2 = 36;
        $this->attribute3 = 2 * self::PI;
    }


    public function getAttribute1() {
        return $this->attribute1;
    }

    public function setAttribute1($attribute1) {
        $this->attribute1 = $attribute1;
    }

    private function getAttribute2() {
        return $this->attribute2;
    }

}

Comme on peut le voir, cette classe d'exemple fournit quelques méthodes et attributs simples. Elle nous servira de point de départ dans les prochains exemples.

Lister les méthodes d’un objet

Grâce à l'API Reflection, il est possible d'analyser les méthodes d’un objet depuis l'extérieur. Pour obtenir une liste complète des méthodes, Reflection() met à disposition la méthode statique getMethods().

$reflection_class = new ReflectionClass("Example");

foreach ($reflection_class->getMethods() as $method) {
    echo($method->getName() . "\n"));
}

Le résultat est le suivant :

  • __construct
  • getAttribute1
  • setAttribute1
  • getAttribute2

La fonction ReflectionClass() n'attend comme paramètre que le nom complet de la classe à analyser (y compris le namespace, s'il existe). Pour rendre l'initialisation un peu plus agréable, on peut aussi utiliser directement la résolution du nom de classe de PHP :

$reflection_class = new ReflectionClass( Example::class );

Outre les noms des méthodes, d'autres informations peuvent être lues :

$reflection_class = new ReflectionClass( Example::class );

foreach ($reflection_class->getMethods() as $method) {
    echo($method->getName() . "\n");

    echo("Nombre de paramètres : " . $method->getNumberOfParameters() . "\n");
    echo("Est privé : " . ($method->isPrivate() ? 'Oui' : 'Non') . "\n\n");
}

Le résultat est le suivant :

  • __construction
    • Nombre de paramètres : 0
    • Est privé : Non
  • getAttribute1
    • Nombre de paramètres : 0
    • Est privé : Non
  • setAttribute1
    • Nombre de paramètres : 1
    • Est privé : Non
  • getAttribute2
    • Nombre de paramètres : 0
    • Est privé : Oui

Lire les attributs

logo discord

Besoin d'aide ?

Rejoignez notre communauté officielle et ne restez plus seul à bloquer sur un problème !

En savoir plus