While not strictly required it is recommended to create an actual class for every attribute.
In the most simple case only an empty class is needed with the #[Attribute]
attribute declared
that can be imported from the global namespace with a use statement.
Example #1 Using target specification to restrict where attributes can be used
<?php
namespace Example;
use Attribute;
#[Attribute]
class MyAttribute
{
}
To restrict the type of declaration an attribute can be assigned to, a bitmask can be passed as the first
argument to the #[Attribute]
declaration.
Example #2 Simple Attribute Class
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class MyAttribute
{
}
Declaring MyAttribute on another type will now throw an exception during the call to ReflectionAttribute::newInstance()
By default an attribute can only be used once per declaration. If the attribute should be repeatable on declarations it must
be specified as part of the bitmask to the #[Attribute]
declaration.
Example #3 Using IS_REPEATABLE to allow attribute on a declaration multiple times
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}