Чтение атрибутов через API-интерфейс модуля Reflection
  
   Для доступа к атрибутам классов, методов, функций, параметров, свойств
   и констант класса в API-интерфейсе модуля Reflection предусмотрели метод
   getAttributes(). Метод возвращает массив объектов ReflectionAttribute,
   каждый из которых умеет возвращать название и аргументы атрибута, и создавать объект класса,
   которым представили атрибут.
  
  
   Отделение отражённого представления атрибута от экземпляра самого́ атрибутного класса
   повышает контроль над обработкой ошибок, которые возникают, когда для атрибута не определили класс,
   допустили опечатку в названии аргумента или пропустили значение аргумента. PHP создаёт объекты атрибутных классов и проверяет
   корректность аргументов только после вызова метода ReflectionAttribute::newInstance().
  
  
   Пример #1 Пример чтения атрибутов через API-интерфейс модуля Reflection
   
<?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)
}
*/
     
    
   
    Вместо перебора каждого атрибута объекта отражения
    возможно извлечь атрибуты только конкретного атрибутного класса.
    Для этого при вызове метода в аргументе передают название класса атрибута.
   
   
    Пример #2 Пример чтения конкретных атрибутов через API-интерфейс модуля Reflection
    
<?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
        )
)