PHP 8.5.0 RC4 available for testing

Deklaration von Attributklassen

Es ist empfehlenswert, für jedes Attribut eine eigene Klasse zu definieren. Im einfachsten Fall genügt eine leere Klasse, in der das Attribut #[Attribute] deklariert wird. Das Attribut kann mit einer use-Anweisung aus dem globalen Namensraum importiert werden.

Beispiel #1 Einfache Attributklasse

<?php

namespace Example;

use
Attribute;

#[
Attribute]
class
MyAttribute
{
}

Um die Arten der Deklarationen einzuschränken, auf die ein Attribut angewendet werden kann, kann eine Bitmaske als erstes Argument an die #[Attribute]-Deklaration ü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. Damit ein Attribut wiederholbar ist, muss es in der Bitmaske der #[Attribut]-Deklaration mit dem Flag Attribute::IS_REPEATABLE 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
13
esdras-schonevald
3 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