Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

OOP: Konstruktoren für Verbindungen zum Datenbankserver

Praktischer Einsatz von Konstruktoren und Destruktoren

Übersicht / Seite:

  1. Einführung (in die objektorientierte Programmierung)
  2. Sichtbarkeit (und Kapselung von Eigenschaften und Methoden)
  3. Vererbung (von Eigenschaften und Methoden sowie Autoload von Klassen)
  4. Konstruktoren und Destruktoren (Methoden zum Erzeugen und Auflösen)

    4.1 Konstruktoren und D... (Besonderheiten bei der Vererbung)
    4.2 Praktischer Einsatz (von Konstruktoren und Destruktoren)

  5. Beispiele (eine simple Parserklasse, eine TCP/IP Socket Klasse und mehr ...)

Beispiele zum Verbindungsaufbau mit einem MySQL-Server

Die Beispiele auf dieser Seite verdeutlichen recht gut, wo der Einsatz von Konstruktoren und Destruktoren von Vorteil ist. Beim Verzicht auf einem Kon­struktor müsste eine in der Vaterklasse definierte Methode zum Aufbau einer Verbindung zu einem MySQL-Server wiederholt in den einzelnen Methoden aufge­rufen 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 Vater­klasse 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 star­ten.

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 be­acht­liche Größe erreichen würde.

Vererbung bei Konstruktoren und D... « zurück

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen