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));
add a note

User Contributed Notes 1 note

up
5
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
)

)
To Top