Reading Attributes with the Reflection API
   
    To access attributes from classes, methods, functions, parameters, properties and class constants,
    the Reflection API provides the method getAttributes() on each of the corresponding
    Reflection objects. This method returns an array of ReflectionAttribute instances
    that can be queried for attribute name, arguments and to instantiate an instance of the represented attribute.
   
   
    This separation of reflected attribute representation from actual instance increases control of the programmer
    to handle errors regarding missing attribute classes, mistyped or missing arguments. Only after
    calling ReflectionAttribute::newInstance(), objects of the attribute class are instantiated and the correct matching of arguments
    is validated, not earlier.
   
   
    Example #1 Reading Attributes using 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)
}
*/
     
    
   
    Instead of iterating all attributes on the reflection instance, only those
    of a particular attribute class can be
    retrieved by passing the searched attribute class name as argument.
   
   
    Example #2 Reading Specific Attributes using 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 ¶7 months 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
        )
)