Чтение атрибутов с помощью Reflection API
Для доступа к атрибутам классов, методов, функций, параметров, свойств и констант класса в Reflection API
существует метод getAttributes(), который определен для каждого из перечисленных объектов рефлексии.
Этот метод возвращает массив объектов ReflectionAttribute, у каждого из которых
можно запросить имя и аргументы, а также создать объект класса, представляющего атрибут.
Отделение полученного через рефлексию представления атрибута от явного создания объекта даёт программисту более полный контроль
над обработкой ошибок, связанных с отсутствующими классами атрибутов, опечатками или отсутствующими аргументами.
Объект класса атрибута будет создан и проверен на корректность аргументов только после вызова
метода 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)
}
*/
Чтобы получить атрибуты только нужного класса,
вместо последовательного перебора всех атрибутов объекта рефлексии
в метод getAttributes() передают в качестве аргумента имя искомого класса атрибута.
Пример #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());
}
}
dumpMyAttributeData(new ReflectionClass(Thing::class));
Hirusha Sharma ¶3 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
)
)