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));
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
)
)