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