array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ru', ), 'this' => array ( 0 => 'language.attributes.classes.php', 1 => 'Объявление классов атрибутов', ), 'up' => array ( 0 => 'language.attributes.php', 1 => 'Атрибуты', ), 'prev' => array ( 0 => 'language.attributes.reflection.php', 1 => 'Чтение атрибутов с помощью Reflection API', ), 'next' => array ( 0 => 'language.references.php', 1 => 'Объяснение ссылок', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ru', 'path' => 'language/attributes.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
Хотя и нет строго требования, лучше выполнять рекомендацию — создавать класс для каждого атрибута.
В самом простом случае необходимо создать пустой класс с атрибутом #[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_REPEATABLE при объявлении атрибута для разрешения его многократного присваивания
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}