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.