Facebook
Twitter
Google+
Kommentare
4

PHP Entwurfsmuster: Singleton

Nachdem die letzen zwei Tage nicht wirklich von Softwaretechnik handelten, habe ich mir gedacht, ich schreibe mal wieder was zu meinem Lieblingsthema. Die Entwurfsmuster. Das gute an diesen kleinen Helfern ist, dass es so viele sinnvolle von ihnen gibt. Der heutige Beitrag dreht sich aber nur um eins der meist verwendeten Pattern die man so findet. Und zwar geht es um das Singleton Pattern. Ja ich weiß, keine Überraschung, denn der Titel dieses Postings verrät ja bereits alles.

Die Idee, die hinter einem Singleton steckt ist ganz einfach. Ich benötige genau eine Instanz einer Klasse und möchte sicher gehen, dass es auch keine zweite irgendwie erstellt werden kann. Ein Beispiel für so eine Klasse wäre zum Beispiel eine Datenbankverbindung, wenn man davon ausgeht, dass es nur eine Datenbankverbindung pro Projekt gibt. Wie man dies über einfache PHP Klassen hin bekommt, möchte ich kurz im Folgenden erklären. Aber vielleicht gebe ich einfach am Anfang schon ein Beispiel zu einer Singleton, damit es ein wenig anschaulicher wird.

class Singleton
{
  private static $instance;

  private function __construct( )
  {
  }

  private function __clone( )
  {
  }

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

Man muss zugeben, wirklich komplex sind diese Funktionen nun echt nicht. Die „Privatisierung“ des Konstruktors und der Clone Methode sorgen lediglich dafür, dass man keine Instanz der Klasse erstellen kann ohne über die getInstance() Methode zu gehen.
Eigentlich ist bereits jetzt alles wunderbar, nur eine Instanz kann erstellt werden. Technisch gesehen sind wir auch bereits am Ende angelangt, in der Theorie lohnt es sich hingegen noch ein paar Gedanken in diese Thematik zu stecken. Größter Kritikpunkt bei diesem Entwurfsmuster ist, dass es im Grunde genommen nur ein Ersatz für globale Variablen zu sein scheint. Wenn es nur eine Instanz gibt, dann greifen alle Funktionen, die Methoden dieser Klasse verwenden, genau auf das gleiche Objekt zu. Man kann also nie genau sagen, welche Daten derzeit im Singleton gespeichert sind und welchen Zustand sie gerade hat.

Man sollte sich also im klaren sein, wann und in welchem Umfang man eine Singleton verwendet. Keine Probleme sollte es z.B. bei einer Config Klasse geben, solange man nur Daten liest und nicht schreibt. Eine Datenbankklasse kann bei geeignetem Interface auch für dieses Entwurfsmuster prädestiniert sein. Ich könnte noch hunderte Beispiele nennen, nur leider fallen mir keine mehr ein. Nein, Witz bei Seite. Es gibt natürlich sehr viele Anwendungsgebiete, die dieses Pattern wunderbar abdeckt, aber es gibt auch die Schattenseite dieser Programmiertechnik.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

4 Comments

  1. Hi,

    ein kleiner Tipp: man kann den Konstruktor auch als protected deklarieren. Dann können evtl. davon abgeleitete Klassen noch darauf zugreifen, wenn das gewünscht ist.

    Reply
  2. Da hast du natürlich Recht, ich würde die Methode aber erst protected machen, sobald ich mir sicher bin, dass ich die Funktion wirklich überschreiben will. Solange sollte sie meiner Meinung nach auch nur die minimale Sichtbarkeit besitzen.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen