Для доступа к атрибутам из классов, методов, функций, параметров, свойств и констант класса API Reflection предоставляет метод getAttributes() для каждого из соответствующих объектов Reflection. Этот метод возвращает массив экземпляров ReflectionAttribute , которые можно запросить для имени атрибута, аргументов и для создания экземпляра представленного атрибута.

Такое отделение отраженного представления атрибутов от фактического экземпляра увеличивает контроль программиста над обработкой ошибок, связанных с отсутствующими классами атрибутов, опечатками или отсутствующими аргументами. Только после вызова ReflectionAttribute::newInstance() создаются объекты класса атрибута и проверяется правильность сопоставления аргументов, не раньше.

Пример #1 Чтение атрибутов с помощью 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)
}
*/

Вместо повторения всех атрибутов в экземпляре отражения можно получить только атрибуты определенного класса атрибутов, передав имя искомого класса атрибутов в качестве аргумента.

Пример #2 Чтение определенных атрибутов с использованием 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));