Reading Attributes with the Reflection API
Attributen Lezen met de Reflectie API
Om toegang te krijgen tot attributen van klassen, methoden, functies, parameters, eigenschappen en klasseconstanten, gebruik je de methode die wordt aangeboden door de Reflectie API. Deze methode retourneert een array van instanties. Deze instanties kunnen worden geraadpleegd voor de attribuutnaam, argumenten en kunnen worden gebruikt om een instantie van het weergegeven attribuut te initialiseren.
getAttributes``ReflectionAttribute
Het scheiden van de gereflecteerde attribuutrepresentatie van de daadwerkelijke instantie biedt meer controle over foutafhandeling, zoals ontbrekende attribuutklassen, verkeerd getypte argumenten of ontbrekende waarden. Objecten van de attribuutklasse worden pas geïnstantieerd na het aanroepen van ReflectionAttribute::newInstance, waardoor ervoor wordt gezorgd dat argumentvalidatie op dat moment plaatsvindt.
Voorbeeld: Attributen Lezen met de Reflectie API
<?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)
}
*/
In plaats van over alle attributen op de reflectie-instantie te itereren, kun je alleen die van een specifieke attribuutklasse ophalen door de naam van de attribuutklasse als argument door te geven.
Voorbeeld: Specifieke Attributen Lezen met de Reflectie API
<?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));