Daniel (nun registriert): Variablenfunktionen bzw. call_user_func: String für Parameter?

Hallo,
habe 2 strings,

  • einer enthält den namen der aufzurufenden funktion
  • der andere die parameter, so wie man sie manuell der funktion übergeben würde
    (kurzum ich habe eine funktion durch reguläre ausdrücke entsprechend zerlegt).

function test($param1, $param2) {
echo"$param1 $param2";
}

$func = 'test';
$func('hello', 'world');

funktioniert ohne probleme, aber

$param="'hello', 'world'";
$func($param);

eben nicht. ich vermute mal, das problem liegt irgendwo bei den anführungszeichen/hochkommata, oder ist ein aufruf so generell nicht möglich?

bei der nutzung von call_user_func() hätte ich das problem, den string ersteinmal in ein passendes array zu zerlegen, aufgrund der verschiedenen möglichkeiten z.b. komma in einem string als text, 'bla' und "bla" oder nur ne zahl: 1 etc. finde ich das zerlegen doch recht schwer, oder gibt es dafür evtl. schon eine funktion?

vielen dank schonmal :-)

  1. Hallo Daniel,

    habe 2 strings,

    • einer enthält den namen der aufzurufenden funktion
    • der andere die parameter, so wie man sie manuell der funktion übergeben würde
      (kurzum ich habe eine funktion durch reguläre ausdrücke entsprechend zerlegt).

    Warum?

    function test($param1, $param2) {
    echo"$param1 $param2";
    }

    $func = 'test';
    $func('hello', 'world');

    funktioniert ohne probleme, aber

    $param="'hello', 'world'";
    $func($param);

    Warning: Missing argument 2 for test(), called in ...php on line 12 and ...php on line 2

    eben nicht. ich vermute mal, das problem liegt irgendwo bei den anführungszeichen/hochkommata, oder ist ein aufruf so generell nicht möglich?

    Hast Du den ersten Benutzerkommentar zu call_user_func() gelesen?

    Was hast Du eigentlich vor? Der Einsatz von variablen Funktionen ist genauso wie der Einsatz von variablen Variablen höchst selten notwendig, der scheinbare Komfort verschwindet schnell bei der Fehlersuche und artet in das Gegenteil aus. Bitte schildere daher das Gesamtproblem, nicht Dein Symptome.

    Wenn Du Dein Konzept mit variablen Funktionen verwenden willst, dann ist es Deine Aufgabe der variablen Funktion die Parameterzahl zu übergeben, die diese erwartet.

    Freundliche Grüße

    Vinzenz

    1. Danke für deine Antwort, zu deiner Gegenfrage:

      Warum?

      Benötige dies für ein simples templatesystem, habe z.b.
      file.tpl:
      [irgendwas]
      {func:test("hello", "world")}
      [noch irgendwas]

      mit einem regulären ausdruck wird nun die funktion mit ihren parametern ausgelesen, zur zeit funktionsname und parameter getrennt, aber ließe sich natürlich auch in einen string packen.
      das ganze soll dann durch den rückgabewert der funktion ersetzt werden, d.h. die beiden strings (funktionsname und parameter) bzw. der string (funktionsname und parameter in einem string) muss ausgeführt werden.

      Hast Du den ersten Benutzerkommentar zu call_user_func() gelesen?

      Danke, inzwischen schon.
      Nur wie bekomme ich aus dem String mit den Parametern ein Array? Wie ich bereits geschrieben habe, ist dies ja etwas komplexer (zumindest für mich, evtl. gibs da ja ne simple Möglichkeit) oder gibt es in meinem Fall evtl. noch eine ganz andere Möglichkeit, z.b. irgendwie einen string der funktionsnamen und parameter enthält auszuführen?

      Wenn Du Dein Konzept mit variablen Funktionen verwenden willst, dann ist es Deine Aufgabe der variablen Funktion die Parameterzahl zu übergeben, die diese erwartet.

      Ich weigere mich ja nicht dies zu tun, ich weiß nur nicht wie das geht ;)

      1. hi,

        Nur wie bekomme ich aus dem String mit den Parametern ein Array?

        Warum willst du das?

        Wenn du deine Funktion so aufrufen willst, dass du ihr ein Array mit Werten als Parameter übergeben kannst, dann schreibe deine Funktion so, dass sie ein Array mit Werten als Parameter akzeptiert.

        oder gibt es in meinem Fall evtl. noch eine ganz andere Möglichkeit, z.b. irgendwie einen string der funktionsnamen und parameter enthält auszuführen?

        eval - is evil.

        Wenn Du Dein Konzept mit variablen Funktionen verwenden willst, dann ist es Deine Aufgabe der variablen Funktion die Parameterzahl zu übergeben, die diese erwartet.
        Ich weigere mich ja nicht dies zu tun, ich weiß nur nicht wie das geht ;)

        Deine Funktion test erwartet zwei Parameter - also ist

        $func = 'test';
        $func('hello', 'world');

        korrekt.

        $param="'hello', 'world'";
        $func($param);

        • das würde eine Funktion aufrufen, und ihr einen Parameter übergeben.
          Wenn du also willst, dass deine Funktion mit nur einem Parameter glücklich ist, dann schreibe deine Funktion entsprechend.

        Wenn du dieses Konzept weiterverfolgen willst, könntest du dir auch mal das Konzept der variablen Anzahl von Parametern anschauen.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Nur wie bekomme ich aus dem String mit den Parametern ein Array?

          Warum willst du das?

          Für call_user_func wollte ich das.

          eval - is evil.

          Aber es scheint am besten das zu erfüllen, was ich suche und funktioniert auch. evil bezogen auf die sicherheit? der string der mit eval ausgeführt wird, wird aus nem statischen template ausgelesen, man kann nichts von außen festlegen.
          zudem findet das ganze innerhalb einer funktion statt, und die auszuführende funktion mit parameter ist als string der parameter der funktion, die dies alles macht. und von außerhalb kann man ja keine funktion aufrufen, und in meinem scrpt wird sie nur von preg_replace ausgerufen, das aber auch nur aus dem statischen template ließt :-)
          in diesem fall sollte das also sicherheitsmäßig kein problem darstellen.

          Wenn du dieses Konzept weiterverfolgen willst, könntest du dir auch mal das Konzept der variablen Anzahl von Parametern anschauen.

          Der Link wird mir sicher nützlich sein, denn so ähnliche Situationen hatte ich bereits, habs dann per default wert gemacht, in stark begrenztem rahmen stellt das wohl ne alternative dar. Aktuell ging es einfach darum, eine als string gegebene funktion auszuführen und durch ihren returnwert zu ersetzen, was mir dank deinen eval tipp auch gelungen ist, vielen dank! :-)