Sven Rautenberg: Constructor in einer Methode der Klasse erneut aufrufen?

Beitrag lesen

Moin!

Ich habe eine MySQL-Klasse, in der sich drei Methoden befinden.

  1. __construct()
  2. connect()
  3. query()

Das ist mindestens noch eine Methode zu wenig, denn escaping ist zwingend notwendig, benötigt dafür aber ebenfalls die bestehende Connection.

Im Constructor führe ich nun die connect()-Methode aus, um die Verbindung zur Datenbank zu initialisieren und eine Datenbank auszuwählen. In der query()-Methode überprüfe ich mit der Funktion mysql_ping, ob eine Datenbank Verbindung besteht und wenn nicht, möchte ich diese erneut herstellen.

Nun zu meiner eigentlichen Frage:
Ist es legitim in der query()-Methode den Constructor mit $this->__construct(); neu auszuführen, falls die Datenbank-Verbindung nicht mehr besteht oder ist das ein schlechter Stil den Constructor in einer Methode der Klasse neu aufzurufen?

Du hast die Methode connect(). Rufe die auf.

Besser noch: Habe eine Methode getConnection(), die alle notwendigen Prüfungen erledigt. Der Constructor legt dann nur noch die übergebenen DB-Zugangsdaten in der Klasse ab, und alle öffentlichen Methoden rufen intern die getConnection-Methode auf, um das Connection-Handle oder die Mysqli-Klasseninstanz zu erhalten.

Die Methode getConnection() prüft zunächst, ob eine Connection existiert. Wenn nein, verbindet sie die Datenbank, speichert das Handle intern ab, und gibt es zurück.

Wenn ja, wird die Connection gepingt. Ist das erfolgreich, gibts die Connection ebenfalls zurück, ansonsten wird neu connected.

Vorteil: Die DB-Connection wird nur dann aufgebaut, wenn sie wirklich benötigt wird, nämlich beim ersten Query oder Escaping.

Ich weiß, in meinem Beispiel könnte ich in der query()-Methode auch einfach die connect()-Methode aufrufen und damit erübrigt sich meine Frage aber das soll nur ein Beispiel sein um meine Frage zu verdeutlichen. Es ist mehr eine genrelle Frage bezüglich des Constructors.

Ich halte es für sehr kritisch, im Konstruktor intensivere Arbeiten zu erledigen. Ich habe schon Klassen gesehen, die einfach nur durch new Klasse() komplette Seiten mit allen DB-Abfragen ausgegeben haben, ohne dass nach dem Instanziieren noch irgendeine Methode aufgerufen wurde.

Das Instanziieren einer Klasse sollte außer dem Speicherverbrauch für das neue Objekt und den notwendigen Operationen, um die Konstruktor-Parameter zu sichern, keinerlei Ressourcen benötigen. Das Instanziieren ist Teil des Wiederherstellen des Bauplans der Objektabhängigkeiten, damit danach dann die Applikation aktiv werden und die jetzt arbeitsfähigen Methoden benutzen kann.

- Sven Rautenberg