| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

13-07-2010, 11:47
|
|
dakingno1
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 149
|
|
2 Klassen initialiseren sich gegenseitig
Hallo,
ich habe in meinem Projekt logischerweise mehrere Klassen.
Einige davon benötigen sich jedoch immer gegenseitig.
Ich habe zum Beipsiel eien Klasse Shop.class.php und eine Klasse Angebot.class.php
Beide implementieren das Singleton interface.
Jeweils im Konstruktor initialisiere ich eine Klassenvariable mit der Instanz der entsprechenden Klasse.
Was passiert, könnt ihr euch ja vielleicht denken.
Das Projekt geht in eine Endlosschleife mit der folgenden Fehlermeldung:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 52 bytes) in...
Wie kann man das Problem umgehen?
Bisher ist bei mir noch nie so ein Problem aufgetreten.
Vielen Dank im voraus.
|

13-07-2010, 11:56
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Initialisiere das Gegenstück erst, wenn du die aufrufende Klasse bereits vollständig initialisiert hast …*bzw. zumindest bis zu dem Punkt, wo die Singleton-Methode auch eine Instanz zurückliefern kann!
|

13-07-2010, 12:17
|
|
dakingno1
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 149
|
|
ja, daran habe ich auch schon gedacht, aber dann mussi ch immer sicherstellen dass die initialisierung in der Funktion aufgerufen wird die imemr als erstes benötigt wird, damit in den nächsten Funktionen die Instanz auch vorhanden ist.
Klingt auchn icht wirklich sauber.
|

13-07-2010, 13:02
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Dass ein Angebot nur in einem Shop existieren kann, sehe ich ein. Aber wieso kann ein Shop nur existieren, wenn es ein Angebot gibt?
|

13-07-2010, 13:52
|
|
dakingno1
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 149
|
|
Zitat:
Zitat von onemorenerd
Dass ein Angebot nur in einem Shop existieren kann, sehe ich ein. Aber wieso kann ein Shop nur existieren, wenn es ein Angebot gibt?
|
Hallo, ja du hast recht, aber die Klasse Shop benötigt einige Informationen zu einem Angebot und daher die initialisierung im Konstruktor.
|

13-07-2010, 14:13
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Warum Angebot ein Singleton ist, verstehe ich am wenigsten … selbst wenn das bei dir so ist: Woanders ist es nicht so. Grund genug, Angebot nicht als Singleton zu implementieren.
|

13-07-2010, 14:35
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Zitat von dakingno1
… die Klasse Shop benötigt einige Informationen zu einem Angebot und daher die initialisierung im Konstruktor.
|
Welche Informationen sollen das sein und müssen die wirklich schon im Konstruktor bekannt sein? Vermutlich fackelst du viel zu viel im Ctor ab.
|

13-07-2010, 15:15
|
|
dakingno1
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 149
|
|
Eigentlich werden dort nur einige Klassenvariablen mit den entsprechenden Instanzen der benötigten Klassen initialisiert...
|

13-07-2010, 18:46
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Wofür wird denn die Angebots-Instanz im Konstruktor benötigt? Sie sollte an dieser Stelle überhaupt nicht benutzt werden, denn wie bereits erwähnt, muss ein Shop auch ohne Angebote funktionieren. Wenn sie nicht benutzt wird, sollte sie da allenfalls optional hineingereicht werden, aber keinesfalls zwangsweise vorhanden sein müssen.
Wenn sich der Abhängigkeitsknoten in deinem Kopf nicht langsam löst, zeig mal etwas Code her.
|

13-07-2010, 19:51
|
|
litterauspirna
Registrierter Benutzer
|
|
Registriert seit: Nov 2007
Beiträge: 353
|
|
Zitat:
Zitat von dakingno1
Hallo, ja du hast recht, aber die Klasse Shop benötigt einige Informationen zu einem Angebot und daher die initialisierung im Konstruktor.
|
Ich denke du hast da ein riesiges Design Problem im allgemeinen. Die Klasse Shop darf doch niemals nicht von der Klasse Angebot in Abhängigkeit stehen. Schon der logische Umkehrsinn muss dir klar sein. Die Klasse Shop muss, wenn man einen Shop betreiben will, immer existieren. Aber man braucht ja nun nicht immer Angebote in seinem Shop wenn man keine Angebote anbieten will. Also wenn überhaupt dann hängt die Klasse Angebot von der Klasse Shop ab, aber selbst das würde ich nicht in Abhängigkeit setzen, da hast du genügend Möglichkeiten die Klassen als vollkommen eigenständige Klassen zu nutzen ohne diese in irgendeine Abhängigkeit zu setzen.
Gruß litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
|

14-07-2010, 10:39
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Und warum ist der Shop Singleton?
Singletons sind böse !
Und mal wieder:
Mache dich über "Dependency Injection" kundig.
(für alle, welche schon wieder darauf gewartet haben)
|

14-07-2010, 10:45
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Zitat:
Zitat von combie
Singletons sind böse !
|
Plenken übrigens auch …
|

14-07-2010, 11:08
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Singletons sind böse!
Besser?
|

14-07-2010, 11:09
|
|
dakingno1
Registrierter Benutzer
|
|
Registriert seit: Nov 2006
Beiträge: 149
|
|
Wieso sind Singletons böse?
Nur so kann man sicherstellen nur ein einziges Objekt einer Klasse zu besitzen.
Wenn ich eine Seite in meinem Projekt aufrufe, dann ist es ein bestimmter Shop, also benötige ich überall nur ein uns dasselbe Objekt mit entsprechenden Inforamtionen zu diesem Shop.
Dasselbe gilt dann für die Angebote zum Shop.
An mehreren Stellen benötige ich also dieselben Informationen des Angebote.
Ihr habt schon recht dass das im moment nicht ganz sauber ist.
Das liegt aber daran weil das Projekt refaktorisiert wird. Vorher war alles strukturiert Programmiert und die Informationen wurden über Konstanten ausgetauscht.
Daher ist es alles noch so unsauber.
Aber ich merke schon, ich muss bei der Refaktorisierung noch weiter unten anfangen.
Vielen Dank für die Diskussion und Hilfestellung.
Aber eins würde mich noch interessieren.
Wieso sind Singletons nun böse?^^
|

14-07-2010, 11:14
|
|
litterauspirna
Registrierter Benutzer
|
|
Registriert seit: Nov 2007
Beiträge: 353
|
|
Zitat:
Zitat von dakingno1
Wieso sind Singletons böse?
Nur so kann man sicherstellen nur ein einziges Objekt einer Klasse zu besitzen.
Wenn ich eine Seite in meinem Projekt aufrufe, dann ist es ein bestimmter Shop, also benötige ich überall nur ein uns dasselbe Objekt mit entsprechenden Inforamtionen zu diesem Shop.
Dasselbe gilt dann für die Angebote zum Shop.
An mehreren Stellen benötige ich also dieselben Informationen des Angebote.
Ihr habt schon recht dass das im moment nicht ganz sauber ist.
Das liegt aber daran weil das Projekt refaktorisiert wird. Vorher war alles strukturiert Programmiert und die Informationen wurden über Konstanten ausgetauscht.
Daher ist es alles noch so unsauber.
Aber ich merke schon, ich muss bei der Refaktorisierung noch weiter unten anfangen.
Vielen Dank für die Diskussion und Hilfestellung.
Aber eins würde mich noch interessieren.
Wieso sind Singletons nun böse?^^

|
Ich denke du solltest von ganz vorn beginnen das System neu aufzuziehen, denn eine bestehende Anwendung die prozedural geschrieben ist in OOP umzuändern ist denke ich nicht das gelbe om EI. Du kennst die Funktionalität des Shop, also beginne von vorn, ertelle dir Diagramme, Use Case, Klassendiagramme. Durchdenke dir deine Anwendung vorher recht gut, versuche weit voraus zu schauen, vor allem auch wo eventuelle Erweiterungen folgen können.
Sigletons sind nicht böse, aber es gibt meiner Meinung nach nur sehr wenige Fälle wo es Sinn macht die einzusetzen, dass heist in den wenigsten Fällen wird es passieren das ein Objekt nur ein einziges mal existieren sollte. Von daher richte auch mal ein Blick auf registry Pattern.
Gruß litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
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.
HTML-Code ist aus.
|
|
|
|
PHP News
|