Declaring Attribute Classes

Оновлено: 11.05.2023

Хоча це і не є обов'язковою вимогою, але рекомендується створювати власне клас для кожного атрибута. У найпростішому випадку потрібен лише порожній клас з оголошеним атрибутом #[Attribute], який можна імпортувати з глобального простору імен за допомогою інструкції use.

Приклад #1 Простий клас атрибутів

<?php

namespace Example;

use Attribute;

#[Attribute]
class MyAttribute
{
}

Щоб обмежити тип оголошення, якому можна призначити атрибут, бітову маску можна передати як перший аргумент до оголошення #[Атрибут].

Приклад #2 Використання цільової специфікації для обмеження використання атрибутів

<?php

namespace Example;

use Attribute;

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

Оголошення MyAttribute на іншому типі тепер буде генерувати виключення під час виклику ReflectionAttribute::newInstance()

Можна вказати наступні цілі:

  • Атрибут::TARGET_CLASS
  • Атрибут::TARGET_FUNCTION
  • Атрибут::TARGET_METHOD
  • Атрибут::TARGET_PROPERTY
  • Атрибут::TARGET_CLASS_CONSTANT
  • Атрибут::TARGET_PARAMETER
  • Атрибут::TARGET_ALL

За замовчуванням атрибут може бути використаний лише один раз в одній декларації. Якщо атрибут має повторюватися у деклараціях, його слід вказати як частину бітової маски до декларації #[Атрибут].

Приклад #3 Використання IS_REPEATABLE, щоб дозволити атрибут у декларації кілька разів

<?php

namespace Example;

use Attribute;

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