Start · Sprachen · PHP · Referenz · AllowDynamicProperties

AllowDynamicProperties

Klasse

Attribut zur Kennzeichnung von Klassen, die das Setzen dynamischer (nicht deklarierter) Eigenschaften erlauben.

seit PHP 8.2.0 Kategorie: misc

Signatur

#[AllowDynamicProperties]

Beschreibung

Seit PHP 8.2 erzeugt das Setzen von Eigenschaften, die nicht explizit in einer Klasse deklariert wurden, eine Deprecation-Warnung. Das Attribut #[AllowDynamicProperties] hebt diese Einschränkung gezielt für eine Klasse auf und erlaubt es, zur Laufzeit beliebige Eigenschaften dynamisch zu setzen – ähnlich wie in PHP-Versionen vor 8.2.

Dieses Attribut ist besonders nützlich für Legacy-Code, Bibliotheken oder Frameworks, die dynamische Eigenschaften bewusst einsetzen und noch nicht vollständig auf explizite Deklarationen umgestellt wurden. Es sollte jedoch als temporäre Lösung betrachtet werden; die langfristig sauberere Alternative ist das explizite Deklarieren aller Eigenschaften oder die Implementierung der magischen Methoden __get() und __set().

Das Attribut gilt automatisch auch für alle Kindklassen der annotierten Klasse – es muss nicht in jeder Unterklasse wiederholt werden. Klassen, die stdClass erweitern, benötigen das Attribut nicht, da stdClass dynamische Eigenschaften von Haus aus erlaubt.

Es wird empfohlen, #[AllowDynamicProperties] sparsam einzusetzen und den betroffenen Code schrittweise zu refaktorieren, um vollständige Typsicherheit zu erreichen.

Beispiele

Dynamische Eigenschaften ohne Deprecation-Warnung

<?php
#[AllowDynamicProperties]
class BenutzerProfil
{
    public string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}

$profil = new BenutzerProfil('Alice');
// Dynamische Eigenschaft setzen – ohne Deprecation-Warnung dank Attribut
$profil->alter = 30;
$profil->email = 'alice@example.com';

echo $profil->name  . PHP_EOL; // Alice
echo $profil->alter . PHP_EOL; // 30
echo $profil->email . PHP_EOL; // alice@example.com
Alice 30 alice@example.com

Vererbung: Kindklasse erbt Erlaubnis für dynamische Eigenschaften

<?php
#[AllowDynamicProperties]
class Basis
{
    public string $typ = 'basis';
}

// Keine erneute Annotation nötig – Kindklasse erbt das Attribut
class Erweiterung extends Basis
{
    public function __construct()
    {
        // Dynamische Eigenschaft direkt im Konstruktor
        $this->extraFeld = 'dynamisch';
    }
}

$obj = new Erweiterung();
echo $obj->typ       . PHP_EOL; // basis
echo $obj->extraFeld . PHP_EOL; // dynamisch

// Weiteres dynamisches Setzen von außen ebenfalls möglich
$obj->nochEins = 42;
echo $obj->nochEins  . PHP_EOL; // 42
basis dynamisch 42

// Wichtig · Fallstricke

Deprecation in PHP 8.2: Ohne dieses Attribut erzeugt das Setzen nicht deklarierter Eigenschaften seit PHP 8.2 eine E_DEPRECATED-Warnung. In PHP 9.0 ist geplant, dass dies zu einem Fatal Error wird. Der Einsatz von #[AllowDynamicProperties] ist daher nur als Übergangslösung sinnvoll.

Sicherheitshinweis: Dynamische Eigenschaften können die Typsicherheit und Nachvollziehbarkeit von Code stark einschränken. Beim Serialisieren oder Deserialisieren von Objekten mit dynamischen Eigenschaften können unerwartete Felder auftauchen, was Sicherheitslücken begünstigen kann.

Alternative: Für vollständige Kontrolle empfiehlt sich die Implementierung von __get(), __set(), __isset() und __unset(), um dynamischen Zugriff gezielt zu kapseln.