PHP 8.1.20 Released!

ReflectionClass::getAttributes

(PHP 8)

ReflectionClass::getAttributesПолучает атрибуты

Описание

public ReflectionClass::getAttributes(?string $name = null, int $flags = 0): array

Возвращает все атрибуты, объявленные в этом классе, в виде массива ReflectionAttribute.

Список параметров

name

Фильтрация результатов, чтобы оставить только экземпляры ReflectionAttribute для атрибутов, соответствующих этому имени класса.

flags

Флаги для определения способа фильтрации результатов, если указан параметр name.

По умолчанию значение 0, которое возвращает результаты только для атрибутов, относящихся к классу name.

Единственным доступным вариантом является использование константы ReflectionAttribute::IS_INSTANCEOF, которая вместо этого будет использовать для фильтрации instanceof.

Возвращаемые значения

Массив атрибутов в виде объекта ReflectionAttribute.

Примеры

Пример #1 Простой пример использования

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes();
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения данного примера:

Array
(
    [0] => Fruit
    [1] => Red
)

Пример #2 Фильтрация результатов по имени класса

<?php
#[Attribute]
class Fruit {
}

#[Attribute]
class Red {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes('Fruit');
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения данного примера:

Array
(
    [0] => Fruit
)

Пример #3 Фильтрация результатов по имени класса с наследованием

<?php
interface Color {
}

#[Attribute]
class Fruit {
}

#[Attribute]
class Red implements Color {
}

#[Fruit]
#[Red]
class Apple {
}

$class = new ReflectionClass('Apple');
$attributes = $class->getAttributes(Color::class, ReflectionAttribute::IS_INSTANCEOF);
print_r(array_map(fn($attribute) => $attribute->getName(), $attributes));
?>

Результат выполнения данного примера:

Array
(
    [0] => Red
)

Смотрите также

add a note

User Contributed Notes 2 notes

up
2
sergiolibe at gmail dot com
1 year ago
When using getAttributes() with specific attribute class and flags, flag 0 will return just matching attributes with specified class, and 2 will return matching attributes with specified class and children of that class:
<?php
   
#[Attribute(\Attribute::TARGET_CLASS)]
   
class SomeAttribute {}

   
#[Attribute(\Attribute::TARGET_CLASS)]
   
class ChildAttribute extends SomeAttribute {}

   
#[SomeAttribute]
    #[SomeChildAttribute]
   
class SomeClass {}

   
$rc = new ReflectionClass(SomeClass::class);

   
$r_atts = $rc->getAttributes(SomeAttribute::class, 0); // 0 is default, just given class
   
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;

   
$r_atts = $rc->getAttributes(SomeAttribute::class, 2); // given class and children classes
   
echo json_encode(array_map(fn(ReflectionAttribute $r_att) => $r_att->getName(), $r_atts)), PHP_EOL;
?>

output:
["SomeAttribute"]
["SomeAttribute","ChildAttribute"]
up
2
sandrenyl at gmail dot com
1 year ago
When using the method getAttributes() to fetch attributes based on a parent class, the proper flag constant is ReflectionAttribute::IS_INSTANCEOF (which equals 2 as mentionned by sergiolibe).

<?php
$reflectionClass
->getAttributes(SomeParentAttribute::class, ReflectionAttribute::IS_INSTANCEOF);
?>
To Top