Es ist zwar nicht unbedingt erforderlich, für jedes Attribut eine eigene
Klasse zu erstellen, aber es ist empfehlenswert. Im einfachsten Fall wird
nur eine leere Klasse benötigt, in der das Attribut
#[Attribute]
deklariert wird, das mit einer use-Anweisung
aus dem globalen Namespace importiert werden kann.
Beispiel #1 Einfache Attributklasse
<?php
namespace Example;
use Attribute;
#[Attribute]
class MyAttribute
{
}
Um den Typ der Deklaration einzuschränken, dem ein Attribut zugeordnet
werden kann, kann eine Bitmaske als erstes Argument an die Deklaration des
Attributs #[Attribute]
übergeben werden.
Beispiel #2 Verwendung der Zielspezifikation, um die Verwendung von Attributen zu beschränken
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION)]
class MyAttribute
{
}
Wenn MyAttribute für einen anderen Typ deklariert wird, wird nun beim Aufruf von ReflectionAttribute::newInstance() eine Exception ausgelöst.
Die folgenden Ziele können angegeben werden:
Attribute::TARGET_CLASS
Attribute::TARGET_FUNCTION
Attribute::TARGET_METHOD
Attribute::TARGET_PROPERTY
Attribute::TARGET_CLASS_CONSTANT
Attribute::TARGET_PARAMETER
Attribute::TARGET_ALL
Standardmäßig kann ein Attribut nur einmal pro Deklaration verwendet
werden. Wenn das Attribut bei Deklarationen wiederholbar sein soll, muss
dies als Teil der Bitmaske der #[Attribute]
-Deklaration
angegeben werden.
Beispiel #3 Verwendung von IS_REPEATABLE um ein Attribut mehrfach in einer Deklaration zu erlauben
<?php
namespace Example;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_FUNCTION | Attribute::IS_REPEATABLE)]
class MyAttribute
{
}