(00:28:40) Dan: ich habe hier 2 klassen (von der Idee her): Datenbank und Ausführung (DB und Exec). Wenn mit der Datenbank keine Verbindung zum Datenbankserver möglich ist, soll die Datenbank-Klasse eine Methode von Exec aufrufen, welche überprüft, ob der Datenbankserver offline ist und bei diesen bei Bedarf startet (sofern er online ist: Nichts tun und Skript mit einer Fehlermeldung abbrechen).
Soll ich nun eine neue Exec-Instanz innerhalb der DB-Klasse erzeugen, eine Exec-Instanz globalisieren oder die benötigten Methoden von Exec in die Datenbankklasse hinzufügen (was imho die schlechteste Lösung sein sollte)?
(00:30:01) Thomas: mach das was am wenigsten aufwand is, das wo mit du mit wartungsaufwand am meisten verdienen kannst und das was am hirnlosesten is
(00:30:05) Thomas: dann bewirbt dich bei M$
...
Ich bin Dan, und mein Problem steht im Zitat. ;-)
Desweiteren sind Abwandlungen des Problems möglich:
Klasse User, Methode Add: Für diese Methode wird eine Datenbankverbindung benötigt. Die Daten, die in die Datenbank eingetragen werden, werden nicht direkt als Query weitergegeben. Meine Idee diesbezüglich: $DB->insert($table,$fields_array);
Später soll das Objekt hinter $DB austauschbar und vererbt werden, damit z.B. pgsql genutzt werden könnte oder Features implementiert werden könnten, die vielleicht nicht jede Datenbank nutzen kann (z.B. ein PHP-Nachbau der MySQL Views, für ältere MySQL-Versionen => $DB->view(...)).
Vielleicht gehe ich die Sache auf falsch an.
Ich bin gespannt auf Eure Antworten.
--
«Wir können alles schaffen, wir brauchen nur genug dressierte Affen» - infinite monkey theorem
Ich würde das genau so wie Thomas sehen, ehrlich gesagt. Ich selbst würde vermutlich die Exec-Instanz globalisieren, da alles andere irgendwie etwas schmutzig ist. Teile der Exec-Klasse in die DB-Klasse zu legen, ist natürlich sinnvoll... wenn es Sinn macht. (grandiose Bedingung >_<)
Wenn allerdings die Methode in die Exec Klasse gehört, sollte sie da auch bleiben. Das letzte, was ich wollen würde, wäre eine zweite Instanz der Exec Klasse im Scope der DB-Methode, weil das doppelter Speicherverbrauch wäre und die Instanzvariablen unterschiedliche Werte haben könnten (was natürlich u.U. nichts macht, wenn du eh keine verwendest).
Aber ich bin ein OOP-Noob, warte lieber noch, bis jemand Kompetenteres antwortet.
PS: Noch ein Grund für die Globalisierung: Was willst du denn machen, wenn du aus einer Funktion heraus die DB ansteuern möchtest? Da würdest du vermutlich gar nicht drüber nachdenken und entweder $GLOBALS['DB'] oder global $DB benutzen, oder?
Mhhh.. wie wärs wenn du der Datenbankklasse die Methoden und Eigenschaften der Exec Klasse eifnach vererbst?
Dann hast du zwei einzeln zu benutzende Klassen, die du leicht waten kannst, Hast aber trotzdem vollen Zugriff über die eine Klasse.
So würde ich das angehen, solang PHP5 Vererbung unterstützt.^^
--
For everything, there's a season, for everything there's a time...
Logisch unterstützt PHP5 Vererbung, das hat das noch grausamere Classen-Konstrukt in PHP4 schon getan.
Bei PHP5 würde ich anstatt das Objekt mit global zu globalisieren, mit statischen Methoden arbeiten.
ist imo schöner, als:
in jeder Funktion .
Damit die Classe immer gleich heißen, kann müsstest du logischer weise jede Version in eine eigene Datei auslagern.
Andere Möglichkeit währe, mit einer sogenannten singleton Classe/Function zu arbeiten:
mfG
Noch ein Grund für die Globalisierung: Was willst du denn machen, wenn du aus einer Funktion heraus die DB ansteuern möchtest? Da würdest du vermutlich gar nicht drüber nachdenken und entweder $GLOBALS['DB'] oder global $DB benutzen, oder?
...
Das wäre zum Beispiel so ein Problemfall. Ich könnte beispielsweiße die DB als Singleton nutzen, was ich aber nicht möchte, das ich gerne $this verwenden möchte.
Hier gehe ich gleich näher drauf ein.
Zitat von makkurona
Mhhh.. wie wärs wenn du der Datenbankklasse die Methoden und Eigenschaften der Exec Klasse eifnach vererbst?
...
Die Idee ist gar nicht so schlecht, aber für mich erscheint das nicht gerade als saubere Lösung. Desweiteren sind dann Methoden doppelt in Benutzung und das würde ich gerne vermeiden.
Zitat von Xardas der Dunkle
Damit die Classe immer gleich heißen, kann müsstest du logischer weise jede Version in eine eigene Datei auslagern.
Andere Möglichkeit währe, mit einer sogenannten singleton Classe/Function zu arbeiten:
mfG
...
Bei Singletons fehlt mir leider die $this Möglichkeit. Einige weniger restrikte Singletons kann man zwar zur Arbeit mit $this zwingen, aber genauer betrachtet erzeugt man dann eine normale Klasse und wenn es dumm läuft, erhält man in der zweiten Funktion, die ein $this verwendet und eine Klasse erzeugen möchte eine Fehlermeldung.
Hier noch ein Beispiel:
Ich versuche mich von der umständlichen Arraybildung zu trennen und sehe darin den Vorteil der OOP. In diesem Beispiel würde ich z.B. die Anzahl aller `Bewohner` der Stadt `Musterhausen` mit dem Nachnamen `Mustermann` zählen lassen:
Das könnte man auch mit nur einer Funktion lösen, beispielsweise:
--
«Wir können alles schaffen, wir brauchen nur genug dressierte Affen» - infinite monkey theorem