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
{
} 
    © 1997–2020 The PHP Documentation Group
Licensed under the Creative Commons Attribution License v3.0 or later.
    https://www.php.net/manual/en/language.attributes.classes.php