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 Simple Attribute Class
<?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 Using target specification to restrict where attributes can be used
<?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()
The following targets can be specified:
Attribute::TARGET_CLASS
Attribute::TARGET_FUNCTION
Attribute::TARGET_METHOD
Attribute::TARGET_PROPERTY
Attribute::TARGET_CLASS_CONSTANT
Attribute::TARGET_PARAMETER
Attribute::TARGET_ALL
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
{
}