phpbar.de logo

Mailinglisten-Archive

[php] Grundwissenfrage oop

[php] Grundwissenfrage oop

Martin Adler adler.martin at web.de
Mit Nov 19 09:34:33 CET 2008


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