Lesen von Attributen mit der Reflection-API
Mit der Methode getAttributes() der Reflection API kann
für jedes der jeweiligen Reflection-Objekte auf Attribute von Klassen,
Methoden, Funktionen, Parametern, Eigenschaften und Klassenkonstanten
zugegriffen werden. Diese Methode gibt ein Array von
ReflectionAttribute-Instanzen zurück, die nach
Attributnamen und Argumenten abgefragt werden können, um eine Instanz des
entsprechenden Attributs zu erzeugen.
Diese Trennung zwischen der Darstellung des reflektierten Attributs und
der tatsächlichen Instanz erleichtert es dem Programmierer, auf Fehler im
Zusammenhang mit fehlenden Attributklassen, Tippfehlern oder fehlenden
Argumenten zu reagieren. Das Attributobjekt wird erst nach dem Aufruf von
ReflectionAttribute::newInstance() erstellt und auf
korrekte Argumente geprüft, nicht vorher.
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 eines Reflection-Objekts der Reihe nach zu
durchlaufen, kann auch der Name einer bestimmten Attributklasse als
Argument übergeben werden, um nur die entsprechenden Attribute 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));
Hirusha Sharma ¶3 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
)
)