Lesen von Attributen mit der Reflection-API
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));
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
)
)