PHP Conference Nagoya 2025

Deklaration von Attributklassen

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:

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
{
}
add a note

User Contributed Notes 1 note

up
15
esdras-schonevald
2 years ago
#! Require PHP >= 8.0

#! This is a Sample

<?php

declare(strict_types = 1);

#[
Attribute]
class
Foo
{
function
__construct(){
echo
"Running " . __METHOD__ . PHP_EOL;
}
}

#[
Attribute(Attribute::TARGET_CLASS|Attribute::IS_REPEATABLE)]
class
Bar {
function
__construct(?string ...$args){
echo
"Running " . __METHOD__ ,
" args: " . implode(", ", $args) . PHP_EOL;
}
}

#[
Attribute(Attribute::TARGET_ALL)]
class
Baz {
function
__construct(
private
string $parameter
){
echo
"Running " . __METHOD__ ,
" arg: " . $this->parameter . PHP_EOL;
}
}

#[
Foo] // [0]
#[Bar] // [1]
#[Bar("Banana")] // [2]
#[Bar("Banana", "Apple", "Lemon", "Grape")] // [3]
#[Baz("The Only One")] // [4]
class Qux
{
}

// Getting class attribute with ReflectionClass
$ref = new ReflectionClass(Qux::class);
$attrs = $ref->getAttributes(); // Array of attributes

$attrs[0]->newInstance(); // "Running Foo::__construct"
$attrs[1]->newInstance(); // "Running Bar::__construct args: "
$attrs[2]->newInstance(); // "Running Bar::__construct args: Banana"
$attrs[3]->newInstance(); // "Running Bar::__construct args: Banana, Apple, Lemon, Grape"
$attrs[4]->newInstance(); // "Running Baz::__construct arg: The Only One"
To Top