Mit der von der Reflection-API bereitgestellten Methode getAttributes() kann auf die Attribute von Klassen, Methoden, Funktionen, Parametern, Eigenschaften und Klassenkonstanten zugegriffen werden. Diese Methode gibt ein Array von ReflectionAttribute-Instanzen zurück. Diese Instanzen können nach dem Attributnamen und den Argumenten abgefragt werden und können verwendet werden, um eine Instanz des dargestellten Attributs zu instanziieren.
Die Trennung der Repräsentation des reflektierten Attributs von seiner tatsächlichen Instanz ermöglicht eine bessere Kontrolle über die Behandlung von Fehlern wie fehlende Attributklassen, falsch eingegebene Argumente oder fehlende Werte. Objekte der Attributklasse werden erst nach dem Aufruf der Funktion ReflectionAttribute::newInstance() instanziiert, um sicherzustellen, dass die Validierung der Argumente zu diesem Zeitpunkt erfolgt.
Beispiel #1 Lesen von Attributen mit der Reflection-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)
}
*/
Anstatt alle Attribute der Reflection-Instanz zu durchlaufen, kann auch der Name einer bestimmten Attributklasse als Argument übergeben werden, um nur die Attribute dieser Attributklasse abzurufen.
Beispiel #2 Lesen bestimmter Attribute mit der Reflection-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));