phpbar.de logo

Mailinglisten-Archive

[php] Grundwissenfrage oop

[php] Grundwissenfrage oop

Christian Wohlgemuth info at codesign-online.de
Mit Nov 19 16:08:11 CET 2008


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