PHP Conference Fukuoka 2025

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 attributeshttps://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