Signatur
Beschreibung
stdClass ist PHPs eingebaute Basisklasse für generische Objekte. Sie besitzt keine vordefinierten Eigenschaften oder Methoden und dient hauptsächlich als leichtgewichtiger Datencontainer, dem zur Laufzeit beliebige Eigenschaften zugewiesen werden können. Dies macht sie zu einer flexiblen Alternative zu assoziativen Arrays, wenn ein objektorientierter Zugriff (via ->) gewünscht wird.
Ein typischer Einsatzfall ist das Ergebnis von json_decode(): Ohne den Parameter true (Array-Modus) gibt diese Funktion stdClass-Objekte zurück, die die JSON-Struktur widerspiegeln. Auch json_encode() und Datenbankabfragen via PDO (FETCH_OBJ) nutzen stdClass intern. Ebenso wandelt das Casten eines Arrays mit (object) dieses in ein stdClass-Objekt um.
Dynamische Eigenschaften: Anders als bei normalen Klassen kann man stdClass-Instanzen jederzeit neue Eigenschaften hinzufügen, ohne dass eine Klassen-Definition erforderlich ist. Das ist praktisch für schnelle Datentransfer-Objekte (DTOs). Ab PHP 8.2 lösen dynamische Eigenschaften bei regulären Klassen eine Deprecation-Warnung aus – stdClass ist davon jedoch explizit ausgenommen und unterstützt sie weiterhin ohne Einschränkung.
Für komplexe Anwendungen mit fester Struktur sollten eigene Klassen oder readonly-Klassen (PHP 8.2+) bevorzugt werden, da stdClass keine Typ-Sicherheit, keine Methoden und keine IDE-Autovervollständigung bietet.
Beispiele
Einfaches stdClass-Objekt manuell erstellen
<?php
$person = new stdClass();
$person->name = 'Anna';
$person->alter = 30;
$person->aktiv = true;
echo $person->name . ' ist ' . $person->alter . ' Jahre alt.';
// Eigenschaften können auch dynamisch gelesen werden
foreach ((array) $person as $key => $value) {
echo $key . ': ' . var_export($value, true) . PHP_EOL;
}
JSON dekodieren und als stdClass verwenden
<?php
$json = '{"produkt": "Laptop", "preis": 999.99, "tags": ["elektronik", "computer"]}';
// json_decode gibt standardmäßig ein stdClass-Objekt zurück
$data = json_decode($json);
echo $data->produkt . ' kostet ' . $data->preis . ' EUR.' . PHP_EOL;
echo 'Erstes Tag: ' . $data->tags[0] . PHP_EOL;
// Prüfen ob eine Eigenschaft existiert
if (isset($data->preis)) {
echo 'Preis ist gesetzt.' . PHP_EOL;
}
Array in stdClass umwandeln mit (object)-Cast
<?php
$daten = [
'vorname' => 'Max',
'nachname' => 'Muster',
'email' => 'max@example.com',
];
$obj = (object) $daten;
echo $obj->vorname . ' ' . $obj->nachname . PHP_EOL;
echo get_class($obj); // stdClass
// Wichtig · Fallstricke
PHP 8.2 und dynamische Eigenschaften: Ab PHP 8.2 sind dynamische Eigenschaften bei eigenen Klassen deprecated (und seit PHP 9.0 voraussichtlich entfernt). stdClass ist von dieser Regel explizit ausgenommen und darf weiterhin dynamisch befüllt werden. Klassen, die dynamische Eigenschaften benötigen, sollten das Attribut #[AllowDynamicProperties] verwenden.
Keine Typ-Sicherheit: Da stdClass keine feste Struktur hat, bieten IDEs keine Autovervollständigung für ihre Eigenschaften. In größeren Projekten ist es daher ratsam, eigene DTO-Klassen oder readonly-Klassen zu definieren, um Lesbarkeit und Wartbarkeit zu verbessern.
Verschachtelte JSON-Strukturen: Bei tief verschachtelten JSON-Objekten liefert json_decode() verschachtelte stdClass-Objekte. Der Zugriff auf nicht existierende Eigenschaften ergibt null (mit einer PHP-Notice in älteren Versionen), daher sollte stets isset() oder der Null-Coalescing-Operator ?? verwendet werden.