## 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, utilisez 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 instancier une instance de l'attribut représenté.

Séparer la représentation réfléchie 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));
/*
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
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));`