dedlfix: PHP OOP Board

Beitrag lesen

echo $begrüßung;

ich habe dann jetzt mal Singleton verwendet (ich hoffe, dass ich es richtig gemacht habe - ich kenne mich damit eigentlich überhaupt nicht so aus). Code:
Aber es funktioniert nicht. Könnte mir jemand freundlicherweise sagen, warum denn Bitte immer noch gesagt wird, dass z.B. in Zeile 37 keine Instanz vorhanden ist?

Du hast immer noch nicht den Gültigkeitsbereich von Variablen begriffen, wie mir scheint. Du musst Variablen in dem Bereich anlegen, in dem du sie verwenden willst[1]. Das Singleton-Muster hilft dir in dem Fall, dass es immer die selbe Instanz zurückliefert, egal wie oft du es aufrufst. In jeder Funktion/Methode, in der du die DB-Instanz benötigst, schreibst du zuerst $DB = DB::construct(); und kannst dann auf $DB zugreifen. Die Variable $DB kann dabei theoretisch in jeder Funktion anders heißen. Ihr Name tut nichts zur Sache, durch das Singleton hast du jedes Mal den selben Inhalt (den selben!, nicht nur den gleichen).

Das sollte dein Problem zunächst lösen. Allerdings ist dein gesamtes Konzept nicht besonders geeignet, den DB-Zugriff zu kapseln. Du hast noch jede Menge mysql_*()-Funktionen in deinem restlichen Quelltext liegen. Damit mischst du den objektorientierten Ansatz wieder mit der Verwendung herkömmlicher Funktionen.

Du könntest auch einfach mysqli in der OOP-Version einsetzen (meinetwegen auch PDO). Das lässt sich wunderbar erweitern. Du könntest beispielsweise eine eigene Klasse erstellen, die von mysqli erbt und das Singleton hinzufügt.

Aber auch das ist noch nicht besonders übersichtlich. Ziel sollte sein, das komplette Datenbank-Handling vollständig aus der Anwendungslogik zu verbannen. Ich bin dazu übergegangen, in der Anwendungslogik nur noch einen Funktions- oder Methodenaufruf stehen zu haben, der gegebenenfalls ein paar Parameter übergeben bekommt und ein Array (oder was auch immer mir am besten geeignet scheint) als Ergebnis zurückgibt. Vom Zusammenbauen des Statements bis zum Abholen des Ergebnisses erledigt diese Funktion/Methode alles selbständig. Natürlich kann sie dabei ihrerseits auf eine DB-Klasse zugreifen. Doch das muss der eigentlichen Anwendung komplett egal sein. Selbst andere Datenquellen ((XML-)Datei, Webservice, usw.) wären so komplett transparent einbindbar.

Ein weiterer kleiner Verbesserungsvorschlag betrifft das Inkludieren der MySQL-Verbindnungsdaten. Die Include-Datei kann zwar generell bleiben, doch würde ich darin Konstanten anlegen. (Auch andere Konfigurationswerte können bei Bedarf darin angelegt werden.) Die Datei wird einmalig (z.B. am Anfang) ins Script eingebunden. Konstanten sind generell superglobal, auf sie kann man also von überall her ohne weiteres zugreifen.

[1] Das Keyword global lassen wir mal weg, das will ja keiner verwenden.

echo "$verabschiedung $name";