Syntax von Attributen

Die Syntax eines Attributs besteht aus mehreren Schlüsselkomponenten. Die Deklaration eines Attributs beginnt mit #[ und endet mit ]. Sie kann ein oder mehrere Attribute enthalten, die durch Kommata getrennt sind. Der Name des Attributs kann unqualifiziert, qualifiziert oder voll qualifiziert sein, wie in Grundlagen zu Namensräumen beschrieben. Argumente für das Attribut sind optional und werden in Klammern () eingeschlossen. Argumente können nur Literalwerte oder konstante Ausdrücke sein. Es wird sowohl die Syntax für Positionsargumente als auch für benannte Argumente unterstützt.

Wenn ein Attribut über die Reflection-API angefordert wird, wird sein Name wie ein Klassenname behandelt und seine Argumente werden an seinen Konstruktor übergeben. Es wird daher empfohlen, für jedes Attribut eine Klasse einzuführen.

Beispiel #1 Syntax von Attributen

<?php
// a.php
namespace MyExample;

use
Attribute;

#[
Attribute]
class
MyAttribute
{
const
VALUE = 'value';

private
$value;

public function
__construct($value = null)
{
$this->value = $value;
}
}

// b.php

namespace Another;

use
MyExample\MyAttribute;

#[
MyAttribute]
#[
\MyExample\MyAttribute]
#[
MyAttribute(1234)]
#[
MyAttribute(value: 1234)]
#[
MyAttribute(MyAttribute::VALUE)]
#[
MyAttribute(array("key" => "value"))]
#[
MyAttribute(100 + 200)]
class
Thing
{
}

#[
MyAttribute(1234), MyAttribute(5678)]
class
AnotherThing
{
}
add a note

User Contributed Notes 1 note

up
3
yarns dot purport0n at icloud dot com
1 year ago
It wasn't obvious to me for a while but you can subclass attributes

https://3v4l.org/TrMTe

<?php

#[Attribute(Attribute::TARGET_PROPERTY)]
class
PropertyAttributes
{
public function
__construct(
public readonly ?
string $name = null,
public readonly ?
string $label = null,
) {}
}

#[
Attribute(Attribute::TARGET_PROPERTY)]
class
IntegerPropertyAttributes extends PropertyAttributes
{
public function
__construct(
?
string $name = null,
?
string $label = null,
public readonly ?
int $default = null,
public readonly ?
int $min = null,
public readonly ?
int $max = null,
public readonly ?
int $step = null,
) {
parent::__construct($name, $label);
}
}

#[
Attribute(Attribute::TARGET_PROPERTY)]
class
FloatPropertyAttributes extends PropertyAttributes
{
public function
__construct(
?
string $name = null,
?
string $label = null,
public readonly ?
float $default = null,
public readonly ?
float $min = null,
public readonly ?
float $max = null,
) {
parent::__construct($name, $label);
}
}

class
MyClass
{
#[
IntegerPropertyAttributes('prop', 'property: ', 5, 0, 10, 1)]
public
int $prop;
}

$refl = new ReflectionProperty('MyClass', 'prop');
$attributes = $refl->getAttributes();

foreach (
$attributes as $attribute) {
var_dump($attribute->getName());
var_dump($attribute->getArguments());
var_dump($attribute->newInstance());
}
?>
To Top