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));
add a note

User Contributed Notes 1 note

up
5
Hirusha Sharma
4 years ago
Fetch properties from functions:

----------------------------------------
Function definition with attributes:
----------------------------------------
#[ReadOnly]
#[Property(type: 'function', name: 'Hello')]
function Hello()
{
return "Hello";
}

-----------------------------------------
Gather attributes from the function
-----------------------------------------
function getAttributes(Reflector $reflection)
{
$attributes = $reflection->getAttributes();
$result = [];
foreach ($attributes as $attribute)
{
$result[$attribute->getName()] = $attribute->getArguments();
}
return $result;
}

$reflection = new ReflectionFunction("Hello");
print_r(getAttributes($reflection));

-----------------------------
OUTPUT
-----------------------------
Array
(
[ReadOnly] => Array
(
)

[Property] => Array
(
[type] => function
[name] => Hello
)

)
To Top