Mailinglisten-Archive |
Albin Blaschka wrote: > Hallo, > > ich habe eine allgemeine (Grundsatz-)Frage: > > Ich habe im letzten hsalben Jahr mich mit objektorientierter Programmierung > mit PHP 5 beschäftigt, vorher (seit PHP 4.0.6) war ich rein prozedural > "unterwegs". Ausgelöst haben das vor allem die objektorientierten Module a > la SimpleXML oder DOM... > > Nun zu meiner "konkreten" Frage: > > Ich lege ein Objekt von meiner Klasse an: > $myObj = new myClass(); > > ok. ;-) > > Jetzt ist ein Parameter für die weitere Ausführung notwendig, jetzt entweder > über "diverse" Methoden gesetzt werden können, also z. B. > > $myObj->load($someStuff); Nennen wir es mal Möglichkeit a. > > so weit, so gut... > > Eigentlich ist es jedoch auch möglich beides, aufrufen und Parameter > setzen, zu kombinieren: > > $myObj = new myClass($someStuff); und das b. > > Was spricht jetzt für die eine, was für die andere Variante? > Bin ich hier komplett verkehrt? Was sagt ihr dazu, mit etwas mehr Einblick > in diese Materie? Du kannst mit a alles machen, was du mit b auch kannst und dann noch etwas mehr. Trotzdem fallen mir spontan 2 Argumente für b ein: 1. Übersichtlichkeit 2. Performance 3. Um zu verhindern, dass sich vars ändern Beispiel zu 1: Du hast eine DB-Klasse, möchtest die aber nicht global verwenden. Dann kannst du die DB Klasse so übergeben: a) $myObj->setDB($mydb); und deine Klasse kann dann deine db-Klasse verwenden. Was aber nun, wenn du eine Funktion hast, die die DB-Klasse brauchst und du vergisst die DB-Klasse zu übergeben? Also sowas: $myObj =new MyClass(); $myObj->function_die_die_DB_Klasse_braucht(); Dann führt das zu unschönen Fehlern. Besser gleich die DB-Klasse im Konstruktor übergeben: $myObj =new MyClass($mydb); $myObj->function_die_die_DB_Klasse_braucht(); Denn dann kann sowas nicht passieren. Ausserdem ist auch jedem anderen Programmierer, der sich die Klasse ansieht sofort klar, dass es sich hierbei um einen notwendigen Parameter handelt. Beispiel zu 2: class MyClass { public $foo; function __construct() { $this->somevar ='bar'; } } $myObj =new MyClass($mydb); $myObj->foo ='anderer Inhalt'; Denn dann läd sich php sinnlos im Konstruktor eine Standardwert in eine Variable, die sowieso kurz darauf wieder überschrieben wird. Da wäre eine Var-übergabe im Konstruktor also schneller. In dem Beispiel hier ist der Geschwindigkeitsgewinn natürlich nicht bemerkbar. Aber das wird interessant, wenn Strings noch miteinander verbunden werden und das ganze in Schleifen ausgeführt wird :-). Für 3 fällt mir gerade kein Beispiel ein. Aber wenn du willst, dass eine Variabel zwar vom Benutzer gesetzt wird, aber dass sich die Variabel während der Lebzeit der Klasse nicht ändert (oder zumindest sich nicht vom Benutzer ändern lässt), kannst du das sehr effizient machen, in dem du die Variabel als private deklarierst, aber sie mit Hilfe des Konstruktors initialisierst... > > Danke im Voraus, > > Albin Yannik
php::bar PHP Wiki - Listenarchive