Хотя это и не является строго обязательным, рекомендуется создать фактический класс для каждого атрибута. В самом простом случае требуется только пустой класс с #[Attribute]объявленным атрибутом, который можно импортировать из глобального пространства имен с помощью инструкции использования.

Пример #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]объявления.

Пример #3 Использование IS_REPEATABLE для многократного разрешения атрибута в объявлении

<?php

namespace Example;

use Attribute;

#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}