## Lectura de atributos con la API de Reflection

Para acceder a los atributos de clases, métodos, funciones, parámetros, propiedades y constantes de clase, utiliza el método getAttributes() proporcionado por la API de Reflection. Este método devuelve un array de instancias de ReflectionAttribute. Estas instancias pueden consultarse para obtener el nombre del atributo, los argumentos, y también pueden usarse para instanciar una instancia del atributo representado.

Separar la representación reflejada del atributo de su instancia real proporciona un mayor control sobre la gestión de errores, como clases de atributos faltantes, argumentos mal escritos, o valores ausentes. Los objetos de la clase de atributo se instancian solo después de llamar a ReflectionAttribute::newInstance(), lo que garantiza que la validación de los argumentos se realice en ese momento.

Ejemplo #1 Lectura de atributos con la API de 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));

El ejemplo anterior mostrará:

    string(11) "MyAttribute"
    array(1) {
      ["value"]=>
      int(1234)
    }
    object(MyAttribute)#3 (1) {
      ["value"]=>
      int(1234)
    }

En lugar de iterar sobre todos los atributos en la instancia de reflexión, puedes recuperar solo aquellos de una clase de atributo específica pasando el nombre de la clase de atributo como argumento.

Ejemplo #2 Lectura de atributos específicos utilizando la API de 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