Mailinglisten-Archive |
Vielen Dank für die vielen Informationen. Wie in allen Antworten empfohlen, habe ich heute ein singleton 'gemacht' Vielen Dank Christian Wohlgemuth Martin Adler wrote: > Hallo Christian, > > Christian Wohlgemuth wrote: >> Hallo ML, >> >> ich habe eine Frage zum Thema oop: >> >> Angenommen ich habe 3 Klassen, wovon ein Klasse (classOne) ein >> Verbindung zur DB herstellt und die anderen zwei Klassen (classTwo, >> ClassThree) diese Verbindung brauchen. >> Nun muss ich classTwo und classThree die Klasse classOne mit >> 'übergegeben', was wie folgt geschehen kann: >> >> 1. Möglichkeit: >> $classOne = new classOne(); >> $classTwo = new classTwo($classOne); >> $classThree = new classThree($classOne); > > Dies wäre einen solide Lösungsmöglichkeit. > >> 2. Möglichkeit: >> $classOne = new classOne(); >> $classTwo = new classTwo(&$classOne); >> $classThree = new classThree(&$classOne); > > Diese Variante ist in PHP 5 nicht notwendig, da Objekte stets als > Referenz übergeben werden (call by reference). > In PHP 4 jedoch werden "Objekte" als Kopie übergeben (call by value). > Hier macht es durchaus Sinn eine Referenzübergabe zu erzwingen, > allerdings, wie Yannik schon angemerkt hat, nicht bei der > Parameterübergabe sondern in der Parameterliste bei der Deklaration der > Methode. > siehe hierzu auch: > http://docs.php.net/manual/en/ini.core.php#ini.allow-call-time-pass-reference > >> 3. Möglichkeit: >> class classTwo { >> public function __conctruct() { >> $classOne = new classOne(); >> } >> } >> class classThree { >> public function __conctruct() { >> $classOne = new classOne(); >> } >> } > > Hier schließe ich mich Yanniks Ausführung an. Wenn es sich bei > classTwo/classThree um keine Spezialisierung classOne handelt, ist dies > eine gebräuchliche Möglichkeit. Da es sich bei classOne um ein > Datenbankobjekt handelt, wäre es jedoch besser darüber Nachzudenken, > diese als Singleton zu implementieren oder eine Registry zu nutzen. > (kurz ergoogelt: > http://www.dstosch.com/programmierung/design-pattern/enwurfsmuster/entwurfsmuster-registry-pattern.html) > >> 4. Möglichkeit [ungetestet] >> class classTwo { >> public function __conctruct() { >> global $classOne; >> } >> } >> class classThree { >> public function __conctruct() { >> global $classOne; >> } >> } > > Von dieser Möglichkeit sollte man stets Abstand halten. > Verweise auch hier auf den Kommentar von Yannik. > >> 5. Möglichkeit >> class classTwo extends classOne {} >> class classThree extends classOne {} > > Nur dann Sinnvoll, wenn classTwo und classThree Spezialisierungen von > classOne darstellen. > Beispiele: > class PKW extends KFZ {} > class LKW extends KFZ {} > class Gorilla extends Affe {} > ... > Nich Okay wäre: > class Haus extends Zentralheizung {} > > >> Nun meine Frage: welche dieser, mir bekannten, 5 Möglichkeiten sollte >> man benutzen und warum? >> >> Vielen Dank und schönen Feierabend da draussen >> Christian Wohlgemuth
php::bar PHP Wiki - Listenarchive