Fixe Anzahl Argumente aus Array an Funktion übergeben
Ben
- php
Hallo zusammen
Ich bräuchte eine Möglichkeit, wie ich an eine Funktion eine entsprechende Anzahl Argumente übergeben kann, welche aber in einem Array liegen.
Was ich genau vorhabe: Ich lese aus der DB aus, welche Klasse ich benötige. Zu jeder Klasse habe ich ein config-File, in dem die entsprechenden Parameter für den Konstruktor als Array abgelegt sind. Diese möchte ich dann an den Konstruktor übergeben. Es kann natürlich auch vorkommen, dass ein Array als Parameter übergeben wird. Zur Veranschaulichung:
$className="myClass";
$myArray[]="param1";
$myArray[]=array(5,6,4,3);
$myArray[]="param3";
$myClass=new $className(hier müssten die 3 Parameter übergeben werden)
Ich möchte nicht mit func_get_args() rumturnen, ich finde das unsauber. Ich weiss ja eigentlich, wie viele Argumente meine Klasse erwartet, eben so viele wie es Array-Elemente im config-File hat.
Das mit implode() zu versuchen, wie ich es irgendwo gefunden habe, hat nicht funktioniert, da er dann den Returnwert von implode logischerweise als String ansieht und somit meint dass es sich nur um das erste Argument handelt.
Hat jemand eine Idee, wie ich das lösen könnte?
Danke und Gruss
Ben
Hallo
habe nicht verstanden, welches Problem du mit dem an die Funktion übergebenen Array hast. Du kannst die Einzelelemente nicht wiederherstellen?
Kalle
Hallo Kalle
Das Problem ist, das ich nicht das Konfigurations-Array als solches an die Funktion übergeben möchte, sondern die Array-Elemente als einzelne Parameter.
Ich könnte das mit Switch lösen, etwa so:
$className="myClass";
$myConfigArray[]="param1";
$myConfigArray[]=array(5,6,4,3);
$myConfigArray[]="param3";
switch (count($myConfigArray)) {
case 0:
$myClass=new $className();
break;
case 1:
$myClass=new $className($myConfigArray[0]);
break;
case 2:
$myClass=new $className($myConfigArray[0],$myConfigArray[1]);
break;
...
}
Ich möchte aber natürlich eine dynamische Konstruktion, damit es auch funktioniert wenn ich fiktiv einmal 20 Parameter hätte...
Ich hoffe es ist jetzt etwas klarer geworden...
Gruss Ben
Hallo Ben.
Das Problem ist, das ich nicht das Konfigurations-Array als solches an die Funktion übergeben möchte, sondern die Array-Elemente als einzelne Parameter.
Und warum möchtest du den Array nicht übergeben? Das ist momentan das einzig Sinnvolle. Du solltest schon erklären, warum es das aus deiner Sicht nicht ist.
Einen schönen Dienstag noch.
Gruß, Mathias
Hallo Mathias
Das ganze ist so etwas wie ein CMS und die Klassen sind die Module. Für den jeweiligen Navigationspunkt wird dann das entsprechende Modul, bzw. eben die Klasse aufgerufen.
Da nicht alle Klassen die selben Parameter erwarten, habe ich mir gedacht, dass ich (oder derjenige der dann das Modul entwickelt) eine Konfigurationsdatei zu der Klasse erstellt, in der die zu übergebenden Parameter als Array definiert sind. Dies auch damit die Klasse universell einsetzbar bleibt und nicht spezifische Parameter enthält.
Klar könnte ich einfach ein Konfigurations-Array übergeben, und dieses dann in der Klasse auswerten, aber ich weiss ja wie viele Parameter ich benötige und fände es für die universelle Einsetzbarkeit der Klasse übersichtlicher, wenn die Parameter "einzeln" übergeben würden.
Es handelt sich also nicht um eine programmiertechnische Notwendigkeit, sondern eher um die Sauberkeit. Aber wenn es keine Möglichkeit gibt das zu tun werde ich wohl die Array-Lösung benutzen müssen.
Gruss Ben
Moin,
Klar könnte ich einfach ein Konfigurations-Array übergeben, und dieses dann in der Klasse auswerten, aber ich weiss ja wie viele Parameter ich benötige und fände es für die universelle Einsetzbarkeit der Klasse übersichtlicher, wenn die Parameter "einzeln" übergeben würden.
Das weißt du ja eben nicht. Sonst würdest du ja sowas tun:
$inst = new $className($config[0],$config[1],$config[2]);
Und in der Klasse hättest du dann $param1, $param2 und $param3 (bzw. passendere Namen) in Benutzung.
Du willst aber offen bleiben für zwanzig oder mehr Parameter. Und soviele Parameter sind nur sinnvoll in einem Array übergebbar.
Was sich in der Benutzung ja auch kaum unterscheidet:
$inst = new $className($config);
Und in der Klasse dann $p[0], $p[1] und $p[2]. Schönere Namen kriegte man, indem man assoziative Bezeichner für die Arrayelemente verwenden würde. Das würde auch hinsichtlich der Konfiguration der Parameter wesentlich angenehmer werden (es ist immer schlecht, wenn die Bedeutung eines Parameters von seiner Position im Array abhängt - zu schnell ist das mal aus versehen vertauscht).
Es handelt sich also nicht um eine programmiertechnische Notwendigkeit, sondern eher um die Sauberkeit. Aber wenn es keine Möglichkeit gibt das zu tun werde ich wohl die Array-Lösung benutzen müssen.
Das, was du vor hast, halte ich für extrem unsauber. Nimm das Config-Array als Ganzes. Das ist deutlich sauberer. Da kannst du dann obendrein sogar noch nette Default-Einstellungen fix in der Klasse definieren, und nur bestimmte, umdefinierte Werte werden bei der Instanziierung mit einbezogen - falls dafür Bedarf besteht.
- Sven Rautenberg
Hallo Sven
Bei näherer Betrachtung hast du recht. Ich hatte mich einfach irgendwie an die andere Vorstellung geklammert. Aber das mit dem Array ist tatsächlich viel dynamischer.
Danke für's Öffnen der Augen... :-)
Gruss Ben