## Lecture des attributs avec l'API de Reflection

Pour accéder aux attributs des classes, méthodes, fonctions, paramètres, propriétés et constantes de classe, il convient d'utiliser la méthode getAttributes() fournie par l'API de réflexion. Cette méthode retourne un tableau d'instances de ReflectionAttribute. Ces instances permettent d'interroger le nom de l'attribut, ses arguments, et peuvent être utilisées pour créer une instance de l'attribut représenté.

Séparer la représentation obtenue par réflexion d'un attribut de son instance réelle offre un meilleur contrôle sur la gestion des erreurs, comme l'absence de classe d'attribut, les arguments mal typés ou les valeurs manquantes. Les objets de la classe d'attribut ne sont instanciés qu'après l'appel à ReflectionAttribute::newInstance(), garantissant que la validation des arguments a lieu à ce moment-là.

Exemple #1 Lecture des attributs à l'aide de l'API de Reflection

    <?php

    #[Attribute]
    class MyAttribute
    {
        public $value;

        public function __construct($value)
        {
            $this->value = $value;
        }
    }

    #[MyAttribute(value: 1234)]
    class Thing
    {
    }

    function dumpAttributeData($reflection) {
        $attributes = $reflection->getAttributes();

        foreach ($attributes as $attribute) {
           var_dump($attribute->getName());
           var_dump($attribute->getArguments());
           var_dump($attribute->newInstance());
        }
    }

    dumpAttributeData(new ReflectionClass(Thing::class));

L'exemple ci-dessus va afficher :

    string(11) "MyAttribute"
    array(1) {
      ["value"]=>
      int(1234)
    }
    object(MyAttribute)#3 (1) {
      ["value"]=>
      int(1234)
    }

Plutôt que d'itérer sur tous les attributs d'une instance de réflexion, il est possible de récupérer uniquement ceux d'une classe d'attribut spécifique en passant le nom de la classe d'attribut en argument.

Exemple #2 Lecture d'attributs spécifiques à l'aide de l'API de Reflection

    <?php
    #[Attribute]
    class MyAttribute
    {
        public $value;

        public function __construct($value)
        {
            $this->value = $value;
        }
    }

    #[MyAttribute(value: 1234)]
    class Thing
    {
    }

    function dumpMyAttributeData($reflection) {
        $attributes = $reflection->getAttributes(MyAttribute::class);

        foreach ($attributes as $attribute) {
           var_dump($attribute->getName());
           var_dump($attribute->getArguments());
           var_dump($attribute->newInstance());
        }
    }

    dumpMyAttributeData(new ReflectionClass(Thing::class));

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open