Чтение атрибутов с помощью Reflection API
Для доступа к атрибутам классов, методов, функций, параметров, свойств и констант класса, в Reflection API присутствует метод getAttributes() для каждого из перечисленных объектов рефлексии. Этот метод возвращает массив экземпляров 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());
}
}
dumpAttributeData(new ReflectionClass(Thing::class));