10. Oktober 2015 tecker2010

Datenbankzugriff über ein Objekt mit dem Singleton Pattern in PHP

Bei Webanwendungen, die mit MySQL und PHP umgesetzt sind, werden die Daten meist aus der Datenbank bezogen. Hierzu ist eine Schnittstelle erforderlich, um Abfragen an die Datenbank zu senden und dier Ergebnisse zu verarbeiten und darzustellen. Die Datenbankabfragen sind an vielen unterschiedlichen Stellen der Anwendung erforderlich, beim Login zur Authentifizierung des Users, zur Speicherung von eingegebenen Daten, Abfrage von Daten, Speichern von Bestellungen bei Webshops und viele weitere Stellen.

Die Schnittstelle zur Datenbank und alle notwendigen Funktionen werden in einer PHP Klasse zusammengefasst. Oft bedient man sich dann einer Konstruktor-Methode, welche die Verbindung zur Datenbank herstellt und speichert diese in einer Variable ($this->connection) ab. Diese Variable wird in weiteren Funktionen der DB-Klasse (z.B. eine update() oder eine query() Funktion) genutzt.

class DB {

 private $connection = NULL;

 public function __construct() {
    $this->connection = mysql_connect('HOST', 'USER', 'PASSWORD', FALSE);
    if(!$this->connection) {
        die("Verbindung zur Datenbank nicht möglich");
    }
    mysql_select_db($database, $this->connection);
 }

 // weitere Funktionen

}

In anderen Klassen wird die DB Klasse included und ein neues Datenbank-Objekt mittels  $this->db = new DB_MySQL(); erzeugt. Somit sind alle Funktionen der Datenbankklasse verfügbar. Dieser Schritt wird genauso in allen weiteren Klassen, in welchen ein Zugriff zur Datenbank notwendig ist, wiederholt.

Allerdings erzeugt diese Methode bei jedem Aufruf von new DB_MySQL() ein neues Datenbank Objekt. Außerdem liegt die Instanzierung nicht im Bereich der Datenbankklasse, denn diese wird nur included und eine Instanz von dieser erzeugt. Demnach gibt es keine Möglichkeit die Anzahl der Instanzen zu beschränken oder gar zu überwachen. Abhilfe schafft das Singleton Entwurfsmuster bzw. Singleton Pattern.

Das Singleton Pattern stellt sicher, dass es von einer Klasse nur eine einzige Instanz gibt. Die Instanz wird in einer privaten Variable gespeichert und darf somit nur von der Klasse selbst erstellt werden. Die Datenbankklasse prüft, ob es bereits eine Instanz gibt und erzeugt ggf. eine.

<?php

class DB {

    private static $instance = null;

    public static function getInstance() {
        if (self::$instance == null) {
            self::$instance = new DB();
        }
        return self::$instance;
    }

}

In Klassen, welche auf die Datenbank zugreifen möchten, wird nun statt einem neuen Datenbank-Objekt eine neue Instanz erzeugt.

include_once(dirname(__FILE__) . 'db.class.php');
$this->db = DB::getInstance();

 

Verwendung des Singleton Patterns

Das Singleton kommt in der Regel dort zum Einsatz, wo es nur einen zentralen Zugriff auf ein Objekt geben darf. Typische Beispiele sind der Zugriff eine Datenbank, das Schreiben in eine Log-Datei, der Zugriff auf eine Registry oder eine Übersetzungsklasse.

Vorteile

  • Das Muster bietet eine Verbesserung gegenüber globalen Variablen
  • Das Singleton kann durch Unterklassenbildung spezialisiert werden
  • Sollten später mehrere Objekte benötigt werden, ist eine Änderung leicht möglich

Nachteile

  • Es besteht die Gefahr, durch exzessive Verwendung von Singleton quasi ein objektorientiertes Äquivalent zu globalen Variablen zu implementieren
  • das Objekt bei Singletons ist private und kann nicht vererbt werden

 

Tagged: , , ,

Kontakt & Angebot

Webdesign, Webanwendungen oder IT-Beratung - ich helfe Ihnen gern weiter! Nutzen Sie das Kontaktformular für Fragen oder ein kostenloses Angebot.