Для доступа к атрибутам классов, методов, функций, параметров, свойств и констант класса в API-интерфейсе модуля Reflection предусмотрели метод getAttributes(). Метод возвращает массив объектов ReflectionAttribute, каждый из которых умеет возвращать название и аргументы атрибута, и создавать объект класса, которым представили атрибут.
Разделение объекта, который представляет отражение атрибута, и объекта самого класса, которым представили атрибут, повышает контроль над обработкой ошибок, которые возникают, когда для атрибута не определили класс, допустили опечатку или пропустили аргумент. Объект класса атрибута создаётся и проверяется на корректность аргументов только после вызова метода 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
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));
?>