## Чтение атрибутов через 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
    #[Attribute]
    class MyAttribute
    {
        public $value;

        public function __construct($value)
        {
            $this->value = $value;
        }
    }

    #[MyAttribute(value: 1234)]
    class Thing
    {
    }

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

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open