![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Christian Schuhmann Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hallo, da ich gerade an einer neuen Version meines Frameworks sitze möchte ich gleich einige Änderungen einbauen, vorallem die Konfigklasse. Bisher hat der Zugriff etwa so funktioniert PHP-Code: PHP-Code: Ich müsste mich also auf eine bestimmte Stelle verlassen, auf der ich im Argumentenarray den Index ('main') finden kann - das möchte ich aber vermeiden. Wie würdet ihr eine Schnittstelle für verschiedene Konfigtypen erstellen? bobby. |
| | |
| | Nach oben #2 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.480
|
Ne, habe ich nicht so ganz verstanden. Was genau ist das Problem? Was stellt denn bislang das $config->PHP = true; dar? Dass die Daten in einer PHP-Datei als Array hinterlegt sind oder was? Schau dir eventuell mal das Prinzip von Zend_Config an. Vielleicht hilft es ... |
| | |
| | Nach oben #3 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Ich über gebe meinem Config-Objekt nur den Pfad, in dem die Konfigurationsdateien liegen (genauer gesagt mehrere Verzeichnisse, denn es gibt ein globales Config-Verzeichnis und eines je Site). Per mixed Config::get(string section, [string varname]) greife ich auf Werte zu, wobei alle Werte einer "section" in einer Datei im besagten Verzeichnis liegen. Wurden die Werte einer section noch nicht geladen, schaue ich halt nach einer Datei im Verzeichnis und benutze je nach Dateiendung eine bestimmte Methode, die Datei einzulesen. Da das im Moment ausschließlich PHP-Dateien sind, war das eigentlich unnötig, das so umzusetzen (!= YAGNI), aber … natürlich ließe sich hier auch gleich je "section" oder eben Konfigurationsdatei eine Klasse vom entsprechenden Typ bauen, die dann im zentralen Config-Objekt gespeichert bleibt. Nochmal kurz und knapp: Warum nicht anhand der Dateiendung entscheiden, welche Klasse eine Quelle auslesen kann? Basti |
| | |
| | Nach oben #4 | |
| Christian Schuhmann Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hi, Zitat:
PHP-Code: D.h. jetzt greife ich mit PHP-Code: Nur das ich (fast) alle Aufrufe der Klasse Config per __call an die jeweilige Unterklasse weiterleite. Es wird anhand des Indexs (z.B.: system) entschieden, an welche Unterklasse es weitergeleitet wird und da liegt das Problem. In der Methode __call stehen mir alle übergebenen Argumente nur als Array zur verfügung, woher weiß ich nun welcher davon mein Index ist, denn ich dann für die Weiterleitung benötige? Ich glaube der Weg über __call ist nicht der Beste, aber mir will gerade auch kein passendes Pattern dafür einfallen. @Ben: "$config->PHP = true;" war/ist dafür da der Klasse Config mitzuteilen, dass alle folgenden Aufrufe über die Klasse Config_PHP gehen sollen. Das Prinzip von Zend_Config ist nicht ganz das, was ich suche. Ich möchte das alles (zumindest nach außenhin) über die Klasse Config läuft. bobby | |
| | |
| | Nach oben #5 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Wie viele öffentliche Methoden hast du denn da? Mir fällt da nicht mehr ein, als get() und set(). In jedem Fall aber besitzen ja alle konkteren Config-Klassen die gleiche Schnittstelle, denn der Client von Config weiß ja nicht, welche konkrete Klasse die Daten ausliest. Sieht so aus, als läge da dein Problem. Folglich: gemeinsames Interface für alle Klassen definieren, die Config-Daten aus den jeweiligen Quellen auslesen und verändern können (Config_PHP, Config_XML etc.). Somit greifst du aus Config heraus immer nur auf dieses Interface zu und brauchst garnicht zu wissen, was für eine Klasse das denn nun konkret ist (außer beim Bauen eben). Zeig doch mal dein UML-Diagramm oder die eben die Interfaces der einzelnen Klassen. Basti |
| | |
| | Nach oben #6 |
| Christian Schuhmann Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hi Basti, mit UML kann ich leider derzeit nicht dienen, da ich bisher noch keinen schönen UML-Modeller unter Linux gefunden habe. Aber die Klassengerüste sehen ungefähr so aus: PHP-Code: bobby. |
| | |
| | Nach oben #7 | |
| Blubb... öfz Registriert seit: 16.03.2006 Ort: Berlin
Beiträge: 419
| Zitat:
__________________ Vive la France! Welcome to Sarkoworld... | |
| | |
| | Nach oben #8 |
| Gabriel Registriert seit: 27.09.2006 Ort: Radebeul
Beiträge: 407
|
Heiho ich beschäftige mich zur zeit mit den Grundlagen von OOP aber alle Tut's die ich so gefunden habe und als brauchbar für mich gewertet habe sind noch auf PHP4 basis das heißt es gibt noch keine public protected und so weiter sachen folglich hab ich keine ahnung wie das funzt hat jmd ein guten link dazu? grüße Gabriel //Sorry für Offtopic Post aber ich dachte es passt einigermasen zum Thema und wollt kein eigenen Thread aufmachen! |
| | |
| | Nach oben #10 | |
| Benutzer Registriert seit: 03.12.2005 Ort: Osnabrück
Beiträge: 75
| Zitat:
Gruß Christian | |
| | |
| | Nach oben #11 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
…wozu __call()? Die Schnittstelle ist doch klar. Es gibt load(), get() und fetch() (wobei ich grad den Sinn noch nicht ganz blicke). In jedem Fall würd ich die Parameter umdrehen, also erst index, dann item. Damit kannst du letzteren ggf. optional machen und so die ganze Config eines "index" auslesen. Basti |
| | |
| | Nach oben #12 | ||||
| Christian Schuhmann Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hi, Zitat:
Zitat:
PHP-Code: PHP-Code: Zitat:
Das Problem ist nun gelöst, aber wie definierst du eine Schnittstelle (die so wie in den oben genannten Bespielen funktioniert) ohne die Methoden zu kennnen? Da sehe ich nur den Weg über __call. bobby | ||||
| | |
| | Nach oben #13 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
Du kennst die Methoden doch. Der Client der Config-Klasse hat die Methoden get() und fetch() zur Verfügung. Er weiß nichts davon, ob er gerade mit einer Klasse Config_PHP oder Config_CSV oder Config_XML arbeitet. In sofern ist es natürlich auch nicht möglich, aber auch nicht nötig, einzelne dieser Klassen mit Zusatzfunktionen auszustatten. Welche Methode kennt denn Config nicht? Basti |
| | |
| | Nach oben #14 |
| Christian Schuhmann Registriert seit: 09.03.2007 Ort: Nürnberg
Beiträge: 58
|
Hi Basti, meine letzte Frage bezog sich nicht mehr auf die oben genannte Configklasse - es ging allgemein um eine Schnittstelle. Aber ich glaube da habe ich mir wieder ein Problem geschafften, wo es eigentlich nicht nötig wäre. Danke an euch alle und vorallem Basti. bobby //edit: Gib es hier sowas wie "Gelöst" ? |
| | |
| | Nach oben #15 |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.212
| derzeit nicht. Aber du kannst den thread-titel entsprechend ändern, wenn du das möchtest.
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! |
| | |
| | Nach oben #16 |
| Martin Breuer Registriert seit: 17.08.2005 Ort: Berlin
Beiträge: 1.642
|
Den Threadtitel kann nur ein Mod/Admin ändern, nicht der Threadersteller Der kann nur den Subtitle ändern.
__________________ I did it my way - Senseless-Blog |
| | |
| | Nach oben #17 |
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
|
BTW: Kennt jemand eine gute Umsetzung für das prinzipielle Problem: Ein Client baut ein Objekt von einer Klasse (z.B. Config oder Image), das Objekt entscheidet, welche konkrete Klasse die Datenquelle (etc.) handeln kann (Config_PHP, Image_Jpeg) und gibt eben dieses Objekt zurück. Alle diese konkreten Objekte implementieren eine Schnittstelle bzw. werden alle von einer gemeinsamen Basisklasse abgeleitet. Mir fallen da nur zwei(einhalb) sinnige Lösungen ein: 1. Die Klasse Config/Image baut eine Instanz von Config_Csv, Image_Png etc. und behält diese als privates Objektattribut und gibt die Anfragen entsprechend weiter. 2. Es gibt eine Factory, die die jeweilige Klasse baut und zurückgibt. 2 1/2. Config bzw. Image verfügt über eine statische Factory-Methode und ist gleichzeitig Basisklasse für die konkreten Klassen. Any patterns known? Basti |
| | |
| | Nach oben #18 |
| Benutzer Registriert seit: 03.12.2005 Ort: Osnabrück
Beiträge: 75
|
Hallo Basti, nach welchem Prinzip soll die Klasse den ermitteln, von welcher Klasse du ein Objekt benötigst? Und: Soll das Ganze als Singleton implementiert sein oder darf es mehr als ein Objekt je Klasse / Familie geben? Gruß Christian |
| | |
| | Nach oben #19 | ||
| Bastian Fenske Registriert seit: 04.01.2006 Ort: Kassel
Beiträge: 826
| Zitat:
Zitat:
Basti | ||
| | |
| | Nach oben #20 |
| Benutzer Registriert seit: 03.12.2005 Ort: Osnabrück
Beiträge: 75
|
Ich würde wohl den Weg über eine statische Methode getInstance() wählen, die in der Basisklasse definiert wird (also dein Punkt 2.5). Punkt 1 halte insofern für wenig sinnvoll, da du so letztendlich die verwendete Schnittstelle doppelt implementieren musst nur um die Erzeugung des eigentlichen Objektes zu kapseln. Gruß Christian |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |