Signatur
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
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
// 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.