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