zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden PHP OOP: Datenbankeintrag Klasse - ein paar theoretische Überlegungen

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 21.07.2009, 17:18
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard PHP OOP: Datenbankeintrag Klasse - ein paar theoretische Überlegungen

Hallo,
mein aktuelles Problem ist etwas theoretischer, es geht um die objektorientierte Implementierung eines Datenbanktabelleneintrages.

Also eine Klasse dehren Objekte Einträge in meiner Mysql Datenbank entsprechen sollen. Der Sinn des ganzen ist der, das ich diese Klasse später vererben will an eine Komentar bzw. Forumspostklasse (ein solcher Forumspost stellt ja auch einen Datenbankeintrag dar) und außerdem noch an eine ToDolisten-Eintragsklasse (mehrere Webmaster arbeiten an einer Seite, inhaltilich, und sollen sich gegenseitig über einen ToDo-Liste auf dem neusten Stand halten können, auch hier wird das ganze über die Mysql Datenbank gespeichert).

Zunächst, ich bin recht neu in der objektorientierten Programmierung und miss/überinterpretiere das Konzept der Klassen vieleicht ein wenig.

Um das mal zu demonstrieren: die db_tableentry Klassen (die Datenbanktabelleneinstragsklasse) bzw. ihre Objekte repräsentieren ja Datenbankeinträge, im Prinzip besizt sie Methode um Änderungen an diesem Eintrag (An sich selbst) vornehmen zu können, und zur Ausgabe. Aus diversen Gründen besitzt sie auch einen Satz Variablen für die Aufnahme der Spalteneintrage die diese Einstrag in der Tabelle besitzt. Und genau diese Redundanz (der Datenbeitrag "manifestiert" sich an zwei Orten 1. in der Datenbank selber und 2. durch die Belegung der Klassenvariablen die ebenfalls die Spalteneinträge enthalten) macht mir Probleme.

Es stellen sich mir nämlich die Fragen:
1. muss ich bei der erzeugung eines neues Objektes dieser Klasse, bzw. im Konstruktor der Klasse diese Doppelpräsens der Tabelleneintragsinformation (einmal in der Tabelle und dann noch in den Klassen/Objekt Variablen) besonders berücksichtigen? Immerhin darf es ja (oder darf es doch) auf keinen Fall passieren, das in der Datenbank selbst andere Informationen stehen als in den Klassenvariablen! Sonnst müsste ja noch geklärt werden welches die echten/korrekten Informationen sind. Das heist ich muss beim verändern der Information, die Information sowohl in den Variablen und in der Datenbank gleichzeitig ändern?

Was mich zur 2. Frage führt:
Dieses Objekt stellt ja einen (existierenden?) Datenbankeintrag dar. Sollte diese Klasse also nun auch Methoden zur Erzeugung eines neuen Eintrags besitzen? Ein Beispiel, ein Auto ist ein Objekt mit den Methoden: Gas geben, Lenken usw. aber es hat sicher keine Methode mit dem Namen "erzeuge ein neues Auto" oder "kaufe auto", ich hoffe ihr versteht mein Dilemma? Das Erzeugen eines Klassenobjektes (mit $objekt = new classname!, nicht das anlegen eines neues Eintrags) entspricht hier ja nicht einem "kaufe Auto" sondern eher einem "registriere die existens eines Autos".
Wie umgehe ich das Problem? Eine weitere Klasse oder eher eine globale Funktion zur Erzeugung eines Datenbankeintrages?

3. Außerdem soll die Klasse eine Statische Methode erhalten zur Erzeugung einer Liste/eines Arrays von Datenbankeinstragsobjekten und zwar aus Performance Gründen, in der Regel liefert ein Datenbank Select Query ja mehrere Eintrage und die will ich nicht einzeln per PHP als solche db_tableentry Objekte realisieren sondern ich will das mir die Statische Methode das Result gleich auf mehrere Objekte (in einem Array) aufteilt.
Meiner Ursprünglichen Idee nach, würde eine Erzeugung eines solchen Objektes, mit der Verarbeitung der Tabelleninformation und einer Eintragsid funktionieren, der Konstruktur holt dann per select Query den Eintrag mit der gegebenen ID aus der gegebenen Tabelle und speichert die Werte in seinen Variablen. Wenn ich das bei einer Liste einzeln machen würde, würde für jeden Listeneintrag ein neuer select Query abgesetzt werden, was ja nicht so gut ist. Deshalb soll diese Statische Methode die Objekte auch erzeugen können ohne das bei der Erzeugung ein query abgeschickt werden muss, also der Konstruktor soll ein Argument besitzen (vieleicht "trusted" genannt) das die Statische Methode mit dem Wert "true" übergibt plus einem assoziativen Array ([Spaltenmame]->Spaltenwert) mit dem das Objekt erzeugt wird.

Kann man das so machen?

Geändert von braindead (21.07.2009 um 17:22 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 21.07.2009, 17:29
Benutzerbild von Gumbo
XHTMLforum-Kenner
 
Registriert seit: 22.08.2004
Ort: Trier
Beiträge: 2.735
Gumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekanntGumbo ist jedem bekannt
Standard

Wozu soll das alles gut sein? Welchen Vorteil hast du bei einer solchen „Datenbanktabelleneinstragsklasse“ gegenüber der klassischen Herangehensweise?

Ich denke, du machst es dir nur unnötig kompliziert. Das Prinzip der Objektorientierung kann auch übertrieben werden.
__________________
Markus Wulftange
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 21.07.2009, 17:35
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard

Wie gesagt ich will die Klasse später vererben, um mir dann Programmierarbeit zu ersparen. Ich habe in diesem Projekt viele Stellen wo ich sowas wie Gästebucheintrage, Forumseinträge, diverse Komonikationskomentare etc behandeln muss, die sich alle durch leichte veränderungen voneinander Unterscheiden. So muss z.b. der Gästebuchseintrag keinem User zugeordnent werden, die ToDo Listeneinträge brauchen ein Atribut Status (ob das Problem schon abgehandelt wurde oder nicht) usw. da finde ich den Vererbungsansatz einer allgemeinen Klasse ganz praktisch ich kann dann ganz übersichtlichen Code schreiben:
todoobjekt->read() (zum anzeigen)
todoobjekt->done() (zum abhaken)
etc
Natürlich könnte ich hier auch mit Funktionen arbeiten, da ich hier aber viele ähnliche Objekte zu handhaben habe (wo schon aufgelistet) müsste ich da Teilweise Funktionen nur leicht umschreiben und dafür größe Teile des Codes kopieren. Vieleicht liege ich hier auch falsch, zumindest schein mir der Einsatz von Methoden die übersichtlichste Art des codings zu sein, in meinem Fall.
Mit Zitat antworten
  #4 (permalink)  
Alt 21.07.2009, 17:36
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.845
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Hehe, das ist ein wenig, wie das Huhn-oder-Ei-Problem.

Ich hab' mich bis vor einigen Wochen genau dasselbe gefragt, weil ich auf meine "Objekte" in der Datenbank endlich objektorientiert zugreifen wollte.

Die Lösung lautet Registry (zumindest bei mir).

Am Beispiel Kommentar:
Du hast eine DB-Tabelle, wo die Kommentare drin stehen, also schreibst Du dir eine Klasse Kommentar, welche einem Kommentar entspricht.
Zusätzlich schreibst Du Dir eine KommentarRegistry über welche Du Kommentare auflisten, hinzufügen, ändern, löschen kannst.

Der Klasse Kommentar spendierst Du einen Konstruktor mit 2 Parametern, 1. Parameter ist eine Referenz auf die KommentarRegistry (falls man da mal was mit machen möchte), 2. Parameter ist ein assoziatives Array mit Feldname => Wert.

Jetzt ist das Beispiel mit den Kommentaren recht simpel, angenommen, Du hast Artikel, welche kommentiert werden können, dann hast Du eine ArtikelRegistry, über welche die Artikel geladen, geändert, usw. werden.
Die Artikel-Klasse selbst kann aber als Registry für die Kommentare fungieren, wodurch Du eine Objekt-Hierarchie erhälst.

Ich weiß zwar nicht, ob das die beste, oder zumindest eine gute Lösung ist, aber das ist mein derzeitiger Ansatz, evtl. hilft's Dir ja etwas weiter.
Mit Zitat antworten
  #5 (permalink)  
Alt 21.07.2009, 17:44
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard

Das ist interessant, mal überlegen ob ich damit klarkomme, bin wie gesagt noch nicht so bewandert auf dem Gebiet. Aber ich versuche das mal umzusetzen.
Mit Zitat antworten
  #6 (permalink)  
Alt 21.07.2009, 17:57
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.845
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

Wie gesagt, ich hab' mich sehr lange schwer damit getan.

Meine Lösung sieht jetzt (vereinfacht) so aus:

Es gibt Namespaces, Tabellen, Datensätze, wie gesagt, vereinfacht, tatsächlich gibt es mehr.

Ein Namespace darf nur weitere Namespaces, oder Tabellen enthalten, eine Tabelle nur Datensätze, ein Datensatz nix.

Die Klasse Namespace fungiert als Registry für Namespaces und Tabellen, die Klasse Tabelle fungiert als Registry für Datensätze.

Zu Beginn des Scriptes wird ein virtueller globaler Namespace erstellt, also eine Instanz der Klasse Namespace, welchen es aber eigentlich nicht gibt. Dieser globale Namespace dient nur als Einstiegspunkt, um weitere Namespace oder Tabellen zu laden. Über die Tabellen-Objekte werden dann die Datensätze geladen, z.B. ungefähr so:
PHP-Code:
$globalNamespace->getNamespace('Core')->getTable('Artikel')->listRecords(...); 
Direkten Zugriff auf die DB versuche ich zu vermeiden, weil jede Klasse, die "Registry-Charakter" hat ebenfalls einen Cache implementiert, so dass nicht immer alle Datensätze geladen werden müssen, fertig bin ich damit aber auch noch nicht.
Mit Zitat antworten
  #7 (permalink)  
Alt 21.07.2009, 18:30
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 24.09.2003
Beiträge: 243
braindead befindet sich auf einem aufstrebenden Ast
Standard

Oha, ganz schön harter Tobak aber durchaus logisch und nachvollziehbar. Ich weiß nur nicht ob es sich für mein kleines Projekt lohnt das so krass aufzuziehen, ich meine wenn Performance keine Rolle spielen würde, dann auf jedenfall, garkeine Frage oder bei einem richtig großen Projekt auch. Ich muss mal darüber nachdenken und es wirken lassen Eine alternative wäre vieleicht einfach statische Methoden zu benuzen um Objekte neu anzulegen, mal sehen.
Mit Zitat antworten
  #8 (permalink)  
Alt 21.07.2009, 19:02
Benutzerbild von mantiz
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 25.02.2007
Beiträge: 2.845
mantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz seinmantiz kann auf vieles stolz sein
Standard

*g, ich wollte damit auch nicht sagen, dass Du es so aufziehen musst oder solltest.

Ich wollte Dir nur ein Beispiel geben, was damit theoretisch denkbar wäre.
Bei mir bildet dieses Konstrukt den neuen Kern meines CMS-Entwurfs, daher muss es schon etwas mächtiger sein.

Bei Dir würde ja evtl. schon eine simple Registry-Klasse reichen.

Kannst ja mal schreiben, sobald Du eine Lösung für Dich gefunden hast, würde mich interessieren.
Mit Zitat antworten
  #9 (permalink)  
Alt 21.07.2009, 23:21
Benutzerbild von Timo
table-layout: none;
XHTMLforum-Kenner
 
Registriert seit: 11.11.2006
Beiträge: 5.354
Timo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein LichtblickTimo ist ein Lichtblick
Standard

Vieleicht ist ja schon PDO was für dich.
__________________
Um weitere Erklärungen eingeblendet zu bekommen, drücken Sie bitte die Tastenkombination Alt + F4
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 22.07.2009, 13:34
Benutzerbild von inta
free as in freedom
XHTMLforum-Kenner
 
Registriert seit: 04.12.2006
Ort: Berlin
Beiträge: 5.027
inta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz seininta kann auf vieles stolz sein
Standard

PDO würde ich sowieso empfehlen, aber das ist ja keine Datenbankabstraktion.

Bisher nutze ich auch nur PDO direkt, aber mantiz Überlegungen finde ich sehr interessant, vor allem bei umfangreichen Anwendungen kann sich das bezahlt machen.
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP, OOP und Array Übergabe laborix Serveradministration und serverseitige Scripte 35 22.12.2010 13:38
wo ist OOP für php sinnvoll? sqrack Serveradministration und serverseitige Scripte 5 12.09.2010 17:23
OOP mit PHP lernen Praktikant Ressourcen 28 05.10.2008 23:07
Dateien auslagern - Include und PHP ArcVieh Serveradministration und serverseitige Scripte 17 27.03.2008 19:09
Text innerhalb von PHP eine Klasse zuweisen lindstrom CSS 4 06.11.2006 11:34


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:01 Uhr.