SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=239&group=44
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Konstruktoren und Destruktoren


Der bereits aus PHP 4 bekannte Konstruktor ist Teil eines Phasenmodells, wobei das Objekt nach dem Initialisierungszustand (Konstruktor) zur Benutzung freisteht und am Ende beseitigt wird (Destruktor). Ein typisches Szenario, welches wir auch bei Aktionen im Alltag wieder finden, wenn wir beispielsweise etwas auf- und abbauen.


Funktionsweise von Konstruktoren und Destruktoren

Ein Konstruktor ist nichts anderes als eine Funktion, die immer dann aufgerufen wird, wenn das Objekt der Klasse instanziert wird. Der Konstruktor wird ab sofort mit __construct() deklariert, obwohl er auch dann weiterhin als Konstruktor erkannt wird, wenn er den Namen der Klasse trägt. Konstruktoren und Destruktoren besitzen im Gegensatz zu gewöhnlichen Funktionen keinen Returntyp. Sämtliche Aufräumarbeiten, die zum sorgfältigen Beseitigen eines Objekts beitragen, übernimmt der parameterlose Destruktor __destructor(). Dazu gehört neben der zuletzt aufgerufenen Referenz die Freigabe jeglicher Speicherressourcen für das Objekt.

Ein Objekt existiert, wie alle anderen Variablen auch, bis zum Ende des Skripts oder bis es gezielt zerstört, also auf NULL gesetzt oder mit unset() vernichtet wird. Normalerweise ergeben sich daraus keine Konsequenzen, PHP sorgt automatisch für die Freigabe des belegten Speichers. Es gibt jedoch Anwendungsfälle, in denen externe Programme an der Kommunikation beteiligt sind, wie z. B. Datenbanken. In solchen Fällen wäre es fatal, wenn ein Objekt eine Verbindung zur Datenbank herstellt und dann zerstört wird, während die Verbindung bestehen bleibt. Es entstehen verwaiste Verbindungen. Verfügt eine Datenbank lediglich über rudimentäre Kontrollmechanismen oder eine begrenzte Anzahl von erlaubten Verbindungen, führt dies früher oder später zu Fehlern. Um das Verhalten am Ende der Existenz eines Objekts zu kontrollieren, sind somit Destruktoren genau das richtige Mittel. Sie werden unmittelbar vor der endgültigen Zerstörung aufgerufen.

Beispiel – Konstruktor und Destruktor

<?php

class MeineKlasse {
   public function __construct() {
       echo "Befinden uns im Konstruktor.<br>";
       $this->name = "MeineKlasse";
   }

   public function __destruct() {
       echo "Zerstöre die Klasse: " . $this->name . ".<br>";
   }
}

$objekt = new MeineKlasse();

?>

Ausgabe
Befinden uns im Konstruktor.
Zerstöre die Klasse: MeineKlasse.

Beispiel – ohne public-Schlüsselwort

<?php

class Lebewesen
{  
  function __construct()
  {
    echo "Konstruktor";
  }
  function __destruct()
  {
    echo "Destruktor";
  }
}


$objekt = new Lebewesen();
print_r($objekt);

?>

Ausgabe
Konstruktor Lebewesen Objekt
(
)
Destruktor

Achtung: Bei abgeleiteten Klassen werden Konstruktoren und Destruktoren der Elternklasse nicht automatisch ausgeführt und müssen explizit mit parent::__construct() beziehungsweise mit parent::__destruct() aufgerufen werden. Das Schlüsselwort parent verweist dabei auf die Klasse, von der mit extends geerbt wurde. Der Konstruktor bzw. Destruktor wird über seinen Namen aufgerufen. Nach parent darf lediglich mit dem statischen Verweisoperator :: gearbeitet werden, da zum Zeitpunkt des Konstruktoraufrufs das Objekt noch nicht existiert und deshalb die Definition direkt benutzt wird.