mmofacts.com

Einfache Möglichkeit variable Parameterlisten in PHP weiterzugeben?

gepostet vor 17 Jahre, 2 Monate von DrakeL
Hi,
ich bräuchte eine Möglichkeit (mir fällt jedoch keine solche ein) eine variable Parameterliste, welche eine Methode erhält, an die nächste Methode weiterzugeben.
Daher, dass sowas in der Art möglich ist:
function b()

{
print func_get_arg(0);
}
function a()
{
//Hier die Parameterliste weitergeben
b();
}
a('Hallo');
gepostet vor 17 Jahre, 2 Monate von KoMtuR
Wie wärs mit:

function a() {
b(func_get_args());
}
oder wird dann die Parameterliste in b anders weitergegeben?
gepostet vor 17 Jahre, 2 Monate von DrakeL
Original von KoMtuR
Wie wärs mit:

function a() {
b(func_get_args());
}
oder wird dann die Parameterliste in b anders weitergegeben?

Jep, dann wird an "b()" nur ein Parameter weitergegeben, nämlich das Array der Parameterliste von "a()", soweit war ich schon mal.
Eval ist mir nicht in den Sinn gekommen, weil ich mich weigere es einzusetzen... Dann mach ich es lieber ohne die Möglichkeit ^^
gepostet vor 17 Jahre, 2 Monate von KoMtuR
dann gehts halt so:

function a() {
$arr = func_get_args();
call_user_func_array("b", $arr);
}
Habs getestet mit dem Code hier:

function debug()
{
$i = func_num_args();

for($j = 0; $j < $i; $j++) {
echo func_get_arg($j)."\n";
}
}
function a() {
$arr = func_get_args();
call_user_func_array('debug', $arr);
}
a("test", 1, 2, 3);
?>
Die Ausgabe war dann natürlich das richtige Ergebnis.
gepostet vor 17 Jahre, 2 Monate von DrakeL
Mmh, ich sollte lieber Beispiele nehmen, die mehr meinem Problem entsprechen. ^^ Solang es sich um Funktionen handelt funktioniert diese Lösung. Aber ich bräuchte es eigentlich auf OOP Ebene...
   class Second

{
public __construct()
{
print func_get_arg(0);
}
}

class First
{
public __construct()
{
//Hier die Parameter weitergeben
$b = new b();
}
}
$a = new Klasse('Hallo');
?>
gepostet vor 17 Jahre, 2 Monate von Fatal_Error
ähmmm wenn ich jetzt mal aus deinem beispiel schlau werden würde könnte man ja evtl. helfen, aber das bsp, ist immo für mich extrem unverständlich...
klasse First und Second und du holst dir in a ne klasse "Klasse"?
gepostet vor 17 Jahre, 2 Monate von KoMtuR

class ca {
function debug() {
var_dump(func_get_args());
}
}
function a() {
global $b;
$arr = func_get_args();
$fa = array(&$b, 'debug');
call_user_func_array($fa, $arr);
}
$b = new ca();
a("test", 1, 2, 3);
?>

php5 machts
edit: und bevor du meinst du willst keine globalen sachen nehmen, dann kannste auch die klasse, die du dann daraus ansprechen willst als erstes argument übergeben und dann daraus was machen.
edit2: das steht btw alles schon in den kommentaren von php.net
gepostet vor 17 Jahre, 2 Monate von Agmemon
Also für Dein Problem gibt es zwei allgemeingütige Ansätze:
Solange es sich nun um eine Handvoll Variationen von Parametern handelt, kannst Du das Problem durch Überladen der Funktionen/Methoden lösen.
Aber ich vermute, du denkst da eher an so etwas, wie bei der printf()-Funktion in C, wo man beliebig viele Parameter angeben kann. Intern funktioniert das Ganze über HashMaps. Der Funktion wird also eine Liste von Key/Value Paaren übergeben. Die meisten Sprachen halten hierfür sogar extra Konstrukte bereit. In PHP habe ich es aber noch nicht gesehen. Aber du kannst es manuell machen: Die Methoden bekommen einen Parameter, der eine HashMap (ich glaube PHP Unterscheidet gar nicht zwischen Array und Map, oder?) enthält, in der du bieliebig viele Parameter speichern kannst.
gepostet vor 17 Jahre, 2 Monate von DrakeL
Ich denk da an eine "allgemein gültige" Klasse mit der man ein Objekt einer Klasse bekommt aus einer Datei.
Klasse.php:
   class Klasse

{
public function __construct()
{
}
}
?>
andere Datei:
   $securefile = new SecureFile('Klasse.php');

$klasse = $securefile->getObject(/* Hier dann die Parameter für den Konstruktor */);
?>
Die SecureFile Klasse soll bei der Methode "getObject()" dabei die Datei per "require_once" laden, ein Objekt der Klasse instanzieren und zurück geben.
Ich brauch das etwas öfters, daher hab ich das in eine Klasse gepackt, funktioniert auch überall bei leeren Konstruktoren. Nur an einer Stelle brauchen die Konstruktoren auch Parameter, und da wäre es sinnvoll ich könnte der Methode "getObject()" Parameter geben und diese gibt die weiter an den Konstruktor der zu instanzierende Klasse.
Da ich natürlich in der Klasse nicht einschränken will, ob und welche Parameter übergeben werden können, soll das ganze Variable gehalten werden.
gepostet vor 17 Jahre, 2 Monate von Agmemon
Also ich mache das etwas anders:

include_once $filename;

if(class_exists($classname)) {
$object = new $classname;
} else {
throw new Exception('Klasse ' . $classname . ' nicht gefunden');
}
Ich habe es zwar noch nicht probiert, aber durch den new-Operator, müsstest Du so ganz normal Parameter übergeben können.
gepostet vor 17 Jahre, 2 Monate von DrakeL
Original von Fatal_Error
ähmmm wenn ich jetzt mal aus deinem beispiel schlau werden würde könnte man ja evtl. helfen, aber das bsp, ist immo für mich extrem unverständlich...
klasse First und Second und du holst dir in a ne klasse "Klasse"?

Gar nicht gesehen die Antwort ^^. Muss natürlich "$a = new First('Hallo');" heißen.
Original von Agmemon

Ich habe es zwar noch nicht probiert, aber durch den new-Operator, müsstest Du so ganz normal Parameter übergeben können.
Stimmt, sollte gehen. Nur wird bei mir der Klassenname nicht (immer) sperrat übergeben. Man kann meine Klasse auf 3 verschiedene Art und Weisen benutzen:
new SecureFile('Verzeichnis/Dateiname.Endung');

new SecureFile('Verzeichnis', 'Dateiname.Endung');
new SecureFile('Verzeichnis', 'Dateiname', '.Endung');
Daher der Name der Klasse wird bei den ersten beiden Versionen erst zurecht geschnitten. Aber ich glaube das Problem hab ich selbst nicht richtig verstanden. ^^ Ich muss die variable Parameterliste gar nicht weitergeben (da ich in der Klasse, die die Parameter bekommt feste Parameter im Konstruktor habe). Daher geht das wahrscheinlich nur über eval() dann.
Also wie in deinem Beispiel, nur dass ich den Klassennamen zusammenpuzzle. Die Methode a soll Variable Parameter annehmen, ein Objekt erstellen und dieses die Parameter als feste Parameter übergeben.
PS: Sollte das nächste mal vielleicht erst schauen, was ich wirklich brauche statt gleich hier zu posten. ^^

Auf diese Diskussion antworten