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