phpbar.de logo

Mailinglisten-Archive

[php] Objekt mit Parameter aufrufen vs. "setter" - Methoden

[php] Objekt mit Parameter aufrufen vs. "setter" - Methoden

Yannik Hampe yannik at cipher-code.de
Mit Dez 13 15:39:20 CET 2006



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