PHP 8.1.31 Released!

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

User Contributed Notes 1 note

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

)
To Top