Создавать классы для атрибутов не обязательно, но крайне рекомендуется.
В самом простом случае требуется просто пустой класс с атрибутом #[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]
.
Пример #3 Использование IS_REPEATABLE для разрешения использовать атрибут в объявлении несколько раз
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}