Для каждого атрибута рекомендуют определять отдельный класс.
В самом простом случае создают пустой класс и объявляют для класса атрибут #[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 {}
?>Теперь назначение атрибута MyAttribute другому типу, которой отличается от метода или функции, при вызове метода ReflectionAttribute::newInstance() выбросит исключение.
Атрибутам доступны следующие цели:
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
{
}