Konstruktor und Destruktor in PHP
Erste Schritte: Konstruktor und Destruktor in PHP
In der objektorientierten Programmierung von PHP spielen der Konstruktor
(
__construct()
) und der Destruktor (
__destruct()
) eine zentrale Rolle.
Der Konstruktor wird beim Erzeugen eines Objekts automatisch aufgerufen,
während der Destruktor aktiv wird, wenn ein Objekt seine Lebensdauer beendet.
In diesem Tutorial erfährst du, wann und warum du die beiden Magic‑Methoden einsetzt.
1. Der Konstruktor (__construct)
Die Methode __construct() dient dazu, ein Objekt in einen definierten Startzustand zu bringen:
Standardwerte setzen, abhängige Objekte injizieren, Ressourcen öffnen …
Sie wird automatisch aufgerufen, sobald du new Klasse() ausführst.
class Benutzer { private $name; private $rolle; public function __construct(string $name, string $rolle = 'Gast') { $this->name = $name; $this->rolle = $rolle; } public function begruessung(): string { return "Willkommen, {$this->name} ({$this->rolle})!"; } } $u = new Benutzer('Lisa', 'Admin'); echo $u->begruessung(); // Willkommen, Lisa (Admin)!
- Parameter kannst du wie bei normalen Funktionen typisieren (PHP 7+).
- Optionalwerte (Default‑Parameter) erlauben flexible Aufrufe.
1.1 Konstruktor in Vererbung
Erbt eine Klasse, kannst du den Eltern‑Konstruktor via
parent::__construct()
aufrufen:
class PremiumBenutzer extends Benutzer { private $aboEnde; public function __construct(string $name, string $aboEnde) { parent::__construct($name, 'Premium'); $this->aboEnde = $aboEnde; } }
2. Der Destruktor (__destruct)
Die Methode __destruct() wird automatisch ausgeführt,
wenn das Objekt vom Garbage Collector zerstört wird (Skriptende oder
unset()
).
Typische Aufgaben:
- Datei‑ oder Datenbankverbindungen schließen
- Temporäre Dateien löschen
- Log‑Einträge schreiben
class DateiLogger { private $handle; public function __construct(string $pfad) { $this->handle = fopen($pfad, 'a'); } public function log(string $msg) { fwrite($this->handle, date('Y-m-d H:i:s') . " – $msg\n"); } public function __destruct() { fclose($this->handle); // Ressource sauber schließen } } $log = new DateiLogger('/tmp/app.log'); $log->log('Start des Scripts'); // Am Skript‑Ende wird __destruct() aufgerufen
2.1 Reihenfolge der Destruktoren
Bei Vererbung wird zuerst der Destruktor der Kind‑Klasse aufgerufen, danach der Eltern‑Klasse.
Du kannst im Kind explizit
parent::__destruct()
rufen,
doch PHP erledigt die Kette auch automatisch.
3. Häufige Stolperfallen
- Ausnahmen im Destruktor: Wirfst du innerhalb von
__destruct()
eine Exception,
kann das Skript unerwartet enden – besser Fehler abfangen und loggen. - Lange laufende Destruktoren: Verzögere dein Skript nicht unnötig; große Jobs in Queue auslagern.
- Konstruktor‑Typdeklarationen: Achte in PHP 8+ auf korrekte Typen, sonst TypeError.
4. Best Practices
- Nutze den Konstruktor für zwingend notwendige Abhängigkeiten und Initial‑State.
- Halte den Destruktor schlank – nur essenzielle Aufräumarbeiten (z. B. fclose, pdo = null).
- Vermeide globale Seiteneffekte im Konstruktor (keine header(), exit() etc.).
- Nutze Dependency Injection: Übergib externe Objekte (Logger, PDO) als Parameter, nicht selbst anlegen.
Fazit
Der Konstruktor sorgt für einen sauberen Startzustand deines Objekts;
der Destruktor räumt Ressourcen auf, wenn das Objekt nicht mehr gebraucht wird.
Richtig eingesetzt, machen sie deinen Code robuster und beugen Lecks oder fehlerhaften Zuständen vor.
Verwende sie also bewusst: Konstruktor für Initialisierung, Destruktor für Ordnung –
und behalte Performance sowie Fehlerbehandlung im Auge.