| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Moderator Registriert seit: 18.07.2005
Beiträge: 4.072
![]() ![]() | Hallo alle miteinander, vor ein paar Tagen ist mein Buch zum Thema PHP Design Patterns angekommen und ich habe mich damit beschäftigt, eine Datenbank (z.B. MySQL) gegen eine andere (z.B. XML Dateien) leicht austauschbar zu machen. Als Beispiel zur Übung dient mir hierzu eine Klasse User, die ihre Daten von einer Datenbank bekommen soll. Das ganze sah dann zunächst so aus: Konkrete Implementierung › Ablage › ubuntuusers.de Ein Objekt der Klasse User wird jeweils mit einer ID und einem Namen instanziert. Dazu lese ich einmal Daten aus einer MySQL - Datenbank Code: id | name 1 | Name1 2 | Name2 database.xml PHP-Code: PHP-Code: Ich hab mir also angeschaut was gleich ist: Auslesen der Daten und als User-Objekte zurückgeben. Wenn ich die Userobjekte erst einmal habe, bleibt nur noch: PHP-Code: Daher habe ich mir ein Interface angelegt, dass von beiden Datenbankklassen erwartet, dass sie eine Funktion bereitstellen, um sämtliche User aus der Datenbank auslesen zu können, damit ich die Benutzer als Objekte zurückerhalte. PHP-Code: Verwendung von Klassen › Ablage › ubuntuusers.de Der Aufruf und die Ausgabe erfolgt dann so: PHP-Code: Ich habe die Klassen abstract class MySQL_Database { und abstract class XML_Database { als abstrakt definiert, da ich von ihnen ja noch weitere Klassen ableiten kann, mit denen ich dann z.B. anstelle von Userdaten, Termine eines Kalenders o.ä. auslesen könnte! Diese würden dann aber wieder ein anderes Interface implementieren müssen. Ich stelle mir gerade vor, dass ich für jede "wichtigere" Tabelle, die ich in einer MySQL-Datenbank habe, eine Klasse von der Klasse MySQL_Database ableiten und jeweils ein neues Interface erzeugen oder ableiten müsste. Ist das ein Schritt in die richtige Richtung oder kann ich mich bald vor Klassen nicht mehr retten? Mir fällt momentan leider keine Idee ein, wie ich die Daten noch weiter zusammenfassen könnte. Vielleicht wenn ich dem Interface eine allgemeinere Bezeichnung verpasse: PHP-Code: Ich möchte eigentlich nur wissen, ob ich damit so weiterarbeiten kann oder ob ich doch lieber grundlegend etwas ändern sollte und wenn ja, was? Gruß Geändert von Asipak (01.09.2009 um 16:16 Uhr). |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Moderator Registriert seit: 11.05.2008
Beiträge: 6.268
![]() ![]() ![]() ![]() ![]() ![]() ![]() | Also Zend_Db_Table (Table-Gateway) mag ich garnicht, abgesehen davon ist eine Komposition wohl sicherlich angebrachter als eine Ableitung, denn ein User ist keine Spezifizierung einer Datenbank, sondern benutzt diese lediglich. Ich habe zum Thema Models unabhängig von der Datenquelle schon einmal eine Art Tutorial geschrieben: http://www.php.de/tutorials/54558-tu...l-und-oop.html (Tutorial: PHP/MySQL und OOP) Ich muss zugeben, die Klassen habe ich mittlerweile bei mir stark überarbeitet, ich muss es demnächst mal aktualisieren. Was aber noch aktuell ist, ist das Konzept an sich. Beim Interface hast du die Problematik, dass Datenbank und XML möglicherweise ganz anders arbeiten und eine gleiche Schnittstelle deswegen nicht immer hinzubekommen ist, bzw. performant hinzubekommen ist. So kann ich beispielsweise auch die Session als Persistenzschicht neben der DB oder einem XML verwenden, und die Session muss auf Performance kaum Rücksicht nehmen (serialize/unserialize sind extrem schnell), bei der Datenbank muss ich aber drauf achten, dass ich bei jeder Änderung nicht das komplette Objekt wieder in der DB aktualisiere, weil das durch Fremdschlüssel etc. möglicherweise einen riesigen Overhead annimmt. Nur wie bringt man das in ein gemeinsames Interface?
__________________ "Nuschel ich?" - "Was?" |
| | |
| | |
| Moderator Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Nur mal so semi-topic: Wenn ich solche Ansätze sehe muss ich immer an LINQ denken, gibt dafür zumindest im Ansatz (weis nicht wie weit die sind) was in PHP der geht aber wahrscheinlich noch über dein Interesse hinaus, aber nur um es mal erwähnt zu haben. Damit kann man noch einen Schritt weiter gehen und muss sich nicht direkt um Model-spezifische Methoden kümmern sondern stellt einen sql-ähnlichen Ansatz hin mit dem man auf unterschiedliche Datentypen zugreifen kann, sei es xml, eine sql-datenbank. PHPLinq - LINQ for PHP - Language Integrated Query - Home
__________________ robo47.net - Blog, Codeschnipsel und mehr | |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Sonderbares Konzept.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 30.07.2008
Beiträge: 1.167
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() | Das Konzept von Chriz habe ich vor einiger Zeit auch übernommen. Das ist besonders dann vorteilhaft, wenn man die Queries des Managers möglichst reduziert. Dann ist der Portierungsaufwand - selbst, wenn es auf einen Webservice oder sonst was geht, sehr gering. |
| | |
| | |
| da schreibt der ElePHPant Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Irgendwie kommt mir Linq auch komisch vor. Code als String anzugeben wiederstrebt mir irgendwie. Damit lassen sich automatische checks durch den Editor schlecht machen. Auch Refactoring oder sonst was wird schwer ... |
| | |
| | |||||
| Moderator Registriert seit: 18.07.2005
Beiträge: 4.072
![]() ![]() | Hmm, Käse Danke für eure Antworten, aber ich merke leider, dass ich keine sinnvolle Antwort geben kann. Dazu fehlt mir momentan wohl einfach noch das Wissen über die Materie und ich muss erst in meinem schönen Buch ein paar Kapitel weiterlesen. Zitat:
So habe ich es meist bislang gemacht, von Austauschbarkeit keine Spur, die Klasse ist von der gewählten Datenbank abhängig: PHP-Code: Zitat:
Zitat:
Zitat:
Werd mich wieder melden, wenn ich etwas weiter bin und dann den Thread ausgraben. Gruß Geändert von Asipak (03.09.2009 um 10:04 Uhr). | ||||
| | |
| | ||||||
| Moderator Registriert seit: 11.05.2008
Beiträge: 6.268
![]() ![]() ![]() ![]() ![]() ![]() ![]() | Zitat:
Zitat:
PHP-Code: PHP-Code: Zitat:
PHP-Code: Zitat:
Zitat:
__________________ "Nuschel ich?" - "Was?" | |||||
| | |
| | |||||||
| Moderator Registriert seit: 18.07.2005
Beiträge: 4.072
![]() ![]() | Zitat:
Zitat:
Zitat:
Zitat:
$this-> deutet ja auf die Verwendung in einer Klasse hin, aber holst du dir den Manager in der Userklasse und wieso sollte dort die Funktion _getDefaultUserManager(); definiert sein? Dann müsste ich ja in jeder Klasse so eine Funktion anbieten die dann _getDefault****Manager lauten und die mir dann den jeweilie Manager zurückliefern würde, nur damit ich mir damit dann ein Userobjekt erzeugen könnte, welches dann auch noch in der Klasse User erzeugt werden würde? Oder hast du dich mit dem $this-> vertan. Zitat:
Zitat:
Mein Problem ist wohl die Datenschicht. Habe mir das Row-Data-Gateway und das Table-Data-Gateway Pattern angesehen, jedoch werden diese anhand von Propel erklärt, das diese Pattern wohl implementiert, doch ich mag mir nicht extra Propel installieren, sondern ich würde lieber den Aufbau dieses Patterns und die Funktionsweise kennenlernen. Wie die von Propel erzeugte Klasse dann aufgerufen wird interessiert mich so gar nicht Ich persönlich komme dadurch leider nicht weiter. Durch meine beiden Klasse aus dem ersten Post habe ich ja eine gewisse Unabhängigkeit geschaffen, denke ich, aber wie du schon sagst, Chriz, ein User sollte, wie alle anderen Objekte anderer Klasse auch, eine Datenbank wohl eher benutzen anstatt eine Spezifizierung zu sein, die ich durch eine Vererbung erhalten habe. Das Problem ist nur, mir fällt nichts mehr ein und wenn ich dann einen Code oder ein Tutorial wie das von dir finde, finde ich keine einzige Datenbankabfrage. Auch mit dem Code von rudygotya kann ich leider nichts anfangen, das Zend Framework habe ich noch nicht benutzt, vielleicht sollte ich mir mal das APF runterladen und da mal reinschauen? Es wird leider immer nur vieles erklärt wenn die Daten schon vorliegen, sei es im Array oder sei es das sie über setter gesetzt werden, aber persistent sind die Daten dadurch noch nicht und ich finde einfach keinen vernünftigen Code dazu, von dem ich mir das "Holen der Daten" vielleicht mal abschauen könnte, damit ich es mal selbst umsetzen kann. So wie ich meinen Code im Moment schreibe, eignet er sich jedenfalls nicht für größere Applikationen! Naja, ich werde wie gesagt erst mal weiter in meinem Buch blättern, vielleicht kommt die Erleuchtung ja doch noch. Gruß | ||||||
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Hilfe: datenbank mappen und kopieren | M*I*B | Datenbanken | 29 | 15.02.2012 21:55 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php datenbank unabhängig, trennung von code und datenbank, austauschbarkeit der datenbank, datenbank trennung, myminicity script php, php austauschbares datenbankmodell, propel klassen implementieren interface, tutorial php datenbank adapter, while($data_user = mysql_fetch_array($get_user)) {, trennung daten datenbanken, http://www.php.de/php-fortgeschrittene/58646-datenbank-austauschbar-machen-durch-trennung-von-konkreter-implementierung.html, trennung daten datenbank, code austauschbar machen, myminicity script simplexml_load_file, zend_db_adapter vs zend_db_table, datenbank trennung script |