PHP 8.4.6 Released!

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));
add a note

User Contributed Notes 1 note

up
5
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
)

)
To Top