Mailinglisten-Archive |
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