Хотя нет строго требования, лучше выполнять рекомендацию —
создавать отдельный класс для каждого атрибута. В самом простом случае
создают пустой класс, для которого объявляют атрибут #[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_CLASS
Attribute::TARGET_FUNCTION
Attribute::TARGET_METHOD
Attribute::TARGET_PROPERTY
Attribute::TARGET_CLASS_CONSTANT
Attribute::TARGET_PARAMETER
Attribute::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
{
}