Die Beispiele auf dieser Seite verdeutlichen recht gut, wo der Einsatz von Konstruktoren und
Destruktoren von Vorteil ist. Beim Verzicht auf einem Konstruktor müsste eine in der Vaterklasse definierte Methode zum Aufbau
einer Verbindung zu einem MySQL-Server wiederholt in den einzelnen Methoden aufgerufen werden, mit Konstruktor hingegen nur noch
einmal pro Klasse, einschließlich der erbenden Klassen.
Im ersten Beispiel wird der Konstruktor gleich in der Vaterklasse definiert, ein Aufruf in den abgeleiteten Klassen ist
nicht mehr erforderlich. Wie bereits auf der vorausgehenden Seite erwähnt, so ist ein Aufruf in einer erbenden Klasse aber nur
dann nicht mehr erforderlich, wenn diese Methode mit public deklariert und definiert wurde.
Erstes Beispiel, Einsatz eines Konstruktors und Destruktors (klasse-11.php):
<?php class Vater { protected $mysqli = false; // Konstruktor public function __construct() { $this->mysqli = new mysqli("host", "user", "pw", "db"); if ($this->mysqli->connect_error) exit("Fehler 1"); } // Destruktor public function __destruct() { $this->mysqli->close(); } } class Mutter extends Vater{ protected $vorhanden; protected function pruefeVorhandensein() { if ($result = $this->mysqli->query(" SELECT COUNT(e_mail) as vorhanden FROM namenlose WHERE e_mail = 'weihnachten@im.wald' ")) { $pruefe = $result->fetch_object(); $result->free(); $this->vorhanden = $pruefe->vorhanden; return $pruefe->vorhanden; } } } class Kind extends Mutter{ public function zaehleNamen() { if ($result = $this->mysqli->query(" SELECT COUNT(name) as wieoft FROM namenlose WHERE name = 'Hans' ")) { $pruefe = $result->fetch_object(); $result->free(); if ($this->pruefeVorhandensein() > 0) { echo "Der Name Hans ist ".$pruefe->wieoft."mal ". "vorhanden und <br />\ndie E-Mail-Adresse ist ". $this->vorhanden."mal vorhanden.\n"; } } } } $ausgabe = new Kind(); $ausgabe->zaehleNamen(); /* Ausgabe: Der Name Hans ist 1mal vorhanden und die E-Mail-Adresse ist 1mal vorhanden. */ ?>
Im zweiten Beispiel wurde der Konstruktor in der Vaterklasse gegen eine Methode ausgetauscht, die als
Bezeichner den Namen der Klasse erhielt und zusätzlich wurde bei der Deklaration der Methode das Schlüsselwort protected
verwendet. Bedingt durch dieses Schlüsselwort muss in einer abgeleiteten Klasse ein mit dem Schlüsselwort public deklarierter
Konstruktor vorhanden sein.
Der Name für den Bezeichner spielt hingegen weniger eine Rolle, da PHP Methoden, die als Bezeichner den Namen der Klasse
erhielten, wie Konstruktoren auswertet, wobei Groß- und Kleinschreibung keine Rolle spielt. Bei neueren Versionen von PHP
(ab 5.3.3 und höher) werden Methoden mit dem Namen der Klasse jedoch nicht mehr wie Konstruktoren ausgewertet, wenn
diese innerhalb eines Namespaces notiert wurden.
Zweites Beispiel, Konstruktor mit gleichnamigen Bezeichner (klasse-12.php):
<?php class Vater { protected $mysqli = false; // Konstruktor mit dem Namen der Klasse protected function vater() { $this->mysqli = new mysqli("host", "user", "pw", "db"); if ($this->mysqli->connect_error) exit("Fehler 1"); } // Destruktor public function __destruct() { $this->mysqli->close(); } } class Mutter extends Vater{ protected $vorhanden; // Aufruf des Konstruktors mit parent public function __construct() { parent::__construct(); } protected function pruefeVorhandensein() { if ($result = $this->mysqli->query(" SELECT COUNT(e_mail) as vorhanden FROM namenlose WHERE e_mail = 'weihnachten@im.wald' ")) { $pruefe = $result->fetch_object(); $result->free(); $this->vorhanden = $pruefe->vorhanden; return $pruefe->vorhanden; } } } class Kind extends Mutter{ public function zaehleNamen() { if ($result = $this->mysqli->query(" SELECT COUNT(name) as wieoft FROM namenlose WHERE name = 'Hans' ")) { $pruefe = $result->fetch_object(); $result->free(); if ($this->pruefeVorhandensein() > 0) { echo "Der Name Hans ist ".$pruefe->wieoft."mal ". "vorhanden und <br />\ndie E-Mail-Adresse ist ". $this->vorhanden."mal vorhanden.\n"; } } } } $ausgabe = new Kind(); $ausgabe->zaehleNamen(); /* Ausgabe: Der Name Hans ist 1mal vorhanden und die E-Mail-Adresse ist 1mal vorhanden. */ ?>
Im dritten Beispiel wurde eine einfache Methode mit einem beliebigen Bezeichner definiert. Auch diese
Schreibweise ist möglich, wobei die Methode aus der Vaterklasse sich in der erbenden Klasse sowohl mit $this-> wie mit
parent:: ansprechen lässt.
Drittes Beispiel, Methode mit eigenem Bezeichner (klasse-13.php):
<?php class Vater { protected $mysqli = false; // Methode mit eigenem Bezeichner protected function nehmeOnkel() { $this->mysqli = new mysqli("host", "user", "pw", "db"); if ($this->mysqli->connect_error) exit("Fehler 1"); } // Destruktor public function __destruct() { $this->mysqli->close(); } } class Mutter extends Vater{ protected $vorhanden; // Konstruktor public function __construct() { $this->nehmeOnkel(); } protected function pruefeVorhandensein() { // PHP- und MySQL-Code wie in den Klassen 11 und 12 } } class Kind extends Mutter{ public function zaehleNamen() { // PHP- und MySQL-Code wie in den Klassen 11 und 12 } } $ausgabe = new Kind(); $ausgabe->zaehleNamen(); /* Ausgabe: Der Name Hans ist 1mal vorhanden und die E-Mail-Adresse ist 1mal vorhanden. */ ?>
Hinweis: Nicht nur bei der objektorientierten
Programmierung empfiehlt es sich, die Verbindung zum MySQL-Server und die SQL-Queries testweise mitzuschneiden. Dazu sind die
folgenden beiden Zeilen in der my.ini einzukommentieren (die Raute entfernen), wobei die Pfade und Bezeichnungen sich
unterscheiden können.
Vor und nach jeder Änderung ist der MySQL-Server zu stoppen und neu zu starten.
Folgendes Beispiel bezieht sich auf Xampp unter Windows, wobei der MySQL-Server über das Control Panel gestoppt und gestartet
werden kann.
In ...\mysql\bin\my.ini:
log-bin=mysql-bin
log=".../mysql/dateiname.log"
Nach Beendigung einiger weniger Tests sollte nicht vergessen werden, beide Zeilen wieder mit # auszukommentieren, da die Datei ansonsten sehr schnell eine beachtliche Größe erreichen würde.
Vererbung bei Konstruktoren und D... « zurück
Einstieg in PHP
Übersicht
Diverse Themen