Для каждого атрибута рекомендуют определять отдельный класс. В самом простом случае
достаточно создать пустой класс и объявить для класса атрибут #[Attribute],
который импортируют из глобального пространства имён оператором use.
Пример #1 Пример простого класса с атрибутом
<?php
namespace Example;
use Attribute;
#[Attribute]
class MyAttribute {}
?>
Типы объявлений для нацеливания атрибута ограничивают
путём передачи битовой маски в первом аргументе объявления
#[Attribute].
Пример #2 Спецификация ограничения целей, доступных для присваивания атрибутов
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class MyAttribute {}
?>Вызов метода ReflectionAttribute::newInstance() теперь выбросит исключение при объявлении атрибута MyAttribute для другого типа, кроме метода или функции.
Атрибутам доступны следующие цели:
Attribute::TARGET_CLASSAttribute::TARGET_FUNCTIONAttribute::TARGET_METHODAttribute::TARGET_PROPERTYAttribute::TARGET_CLASS_CONSTANTAttribute::TARGET_PARAMETERAttribute::TARGET_ALL
По умолчанию атрибут разрешается назначить классу, свойству или другому объекту рефлексии
только один раз. Назначить одинаковые атрибуты одному объекту рефлексии получится,
только если объявить атрибут #[Attribute]
с флагом Attribute::IS_REPEATABLE в битовой маске.
Пример #3 Пример с константой IS_REPEATABL, которая разрешит назначать атрибут многократно
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}