Tach!
Variante 2:
foobar("Klassenname", array("publicvar1"=>$string1, "publicvar2"=>$string2), $wichtig1, $wichtig2);
Wenn dir positionierte Parameter reichen, dann kannst du die Keys aus dem Array weglassen - jedenfalls für meinen Lösungsvorschlag.
Die Keys hätten den Vorteil, dass ich vorbelegte Parameter nicht beachten müsste wenn ein Konstruktor z.B. so aussähe:
public function __construct($foo, $bar = null, $foobar = false){/* .. */}
Das ist so nicht richtig. Stattdessen interessieren die Parameter des Konstruktors überhaupt nicht mehr, weil du ja alles nachher selbst setzt oder auch nicht.
Ich würde also $foobar setzen können ohne, dass ich $bar übergeben muss.
Nein, das geht nicht. Es ist nicht möglich, $foobar zu übergeben und $bar wegzulassen. Das geht in Sprachen, wo man die Parameter beim Übergeben explizit benennen kann, aber nicht in PHP. Du kannst nur positioniert Parameter übergeben und das lückenlos von links aus. Rechts können welche fehlen, aber ab da dann alle.
Du kannst $bar nur gedachterweise auslassen, indem du den Defaultwert (hier: null) übergibst. Aber dann hast du ja doch was übergeben. Beispiel htmlspecialchars($string, $flags = ENT_COMPAT | ENT_HTML401, $encoding = 'UTF-8', $double_encode = true). Möchte man das Encoding angeben, ist aber mit den Flags zufrieden, muss man sie trotzdem notieren, weil sonst der Encoding-Parameter eins nach links rutscht und dann als Flags angesehen werden würde.
Wenn der Konstruktor auf normalem Wege aufgerufen wird und optionale Parameter enthält, musst du auch von links lückenlos die Parameter übergeben. Wenn die Parameter ohne Keys in einem Array stehen, ist das nichts anderes. Wenn du stattdessen abweichend davon benannte Parameter nachbilden willst, musst du auf die Möglichkeiten des Konstruktors (wie Berechnungen anstellen oder auf private Eigenschaften/Methoden zugreifen) verzichten. Allerdings gibt es da noch die Möglichkeit der Setter-Funktionen (oder der __set()-Magie). (Setter sind von Java zum Beispiel sattsam bekannt. Ich würde sie aber nur ungern gnadenlos in PHP verwenden wollen. Wenn keine Zugriffslogik benötigt wird und nur 1:1 auf die private Variable zugegriffen wird, muss nur unnötigerweise jedes Mal ein Funktionsaufruf abgearbeitet werden. Das macht das Programm aber weder schneller noch fehlerfreier. "Aber wenn man mal später eine Kapslung braucht ..." - "YAGNI!")
dedlfix.