Konstruktoren und Destruktoren

Der Zugriff auf die Datenbank wird bereits durch die Klasse aus Beispiel 1.2 deutlich vereinfacht. Wir wollen nun den Aufruf der Methoden connect() und disconnect() automatisieren. Bei der Erzeugung eines Objektes der Klasse soll automatisch eine Verbindung zum Datenbankserver aufgebaut werden. Wird das Objekt nicht mehr benötigt, so soll diese Verbindung automatisch abgebaut werden. Hiermit werden weitere Details vor dem Verwender der Klasse verborgen, die er nicht kennen muss.

Für solche Automatismen bei Erzeugung und Freigabe eines Objektes gibt es die speziellen Methoden Konstruktor und Destruktor.

In PHP hat die Konstruktormethode den Namen __construct. Sie kann eine beliebige Anzahl von Parametern akzeptieren, einen Rückgabewert kann sie jedoch nicht zurückgeben. Sie wird nach Erzeugung und Initialisierung (Vorbelegung der Instanzvariablen) des Objektes auf diesem aufgerufen.

Beispiel 1.15 zeigt die Implementierung eines Konstruktors für unsere Datenbankklasse, der die für einen connect()-Aufruf nötigen Parameter akzeptiert und diese an die entsprechende Methode weiterleitet.

Beispiel 1.15: Konstruktor für die MySQL-Klasse

<?php
class DB_MySQL {
  // ...
 
  public function
  __construct($host, $database, $user, $pass) {
    $this->connect($host, $database, $user, $pass);
  }
 
  // ...
}
?>


Aus Kompatibilitätsgründen zu älteren Versionen wird aber auch eine Methode mit dem Namen der Klasse als Konstruktor akzeptiert.

Im Falle eines Fehlers, beispielsweise bei fehlerhaften Zugangsdaten für eine Datenbankverbindung, kann die Konstruktormethode über das Auslösen einer Ausnahme (siehe „Fehlerbehandlung mit Ausnahmen“) abgebrochen werden. Die Ausführung des new-Operators im aufrufenden Kontext schlägt dann fehl und die Ausnahme kann dort entsprechend behandelt werden.

Wird die Konstruktormethode als protected deklariert, so können nur Methoden derselben Klasse ein Objekt der Klasse erzeugen.

Der PHP-Interpreter ruft die Destruktormethode auf einem Objekt auf, wenn keine Variable mehr eine Referenz auf dieses enthält. [3] Der Aufruf erfolgt vor der Freigabe des von dem Objekt belegten Speichers, so dass der Zugriff auf Instanzvariablen in der Destruktormethode noch möglich ist. Die Destruktormethode trägt in PHP den Namen __destruct. Sie akzeptiert keine Parameter und kann ebenfalls kein Ergebnis zurückliefern.

Beispiel 1.16 zeigt einen Destruktor, der bei seinem Aufruf disconnect ausführt und somit die mit dem Objekt assoziierte Datenbankverbindung schließt.

Beispiel 1.16: Destruktor für die MySQL-Klasse

<?php
class DB_MySQL {
  // ...
 
  public function __destruct() {
    $this->disconnect();
  }
 
  // ...
}
?>


Beispiel 1.17: Verwendung der um Konstruktor und Destruktor erweiterten Klasse

<?php
require_once 'DB_MySQL.php';
 
$mysql = new DB_MySQL('localhost', 'test', 'root', '');
$mysql->query('SELECT spalte FROM tabelle');
 
while ($row = $mysql->fetchRow()) {
  // ...
}
?>





[3] Dies stimmt leider nicht ganz, da eine Garbage Collection mit Reference Counting, wie sie der PHP-Interpreter verwendet, nicht immer direkt ermitteln kann, wann ein Objekt nicht mehr referenziert wird.