Till: Klasseninstanz mit Parametern aus Array

Hallo!

Ich habe eine Klasse:
  foo($bar, $foobar)

Ich habe eine Datei mit einem Array:
  $foo = array('bar', 'foobar')

Ich möchte nun die Klasse mit den Parametern aus dem Array aufrufen
  $bar = foo('bar', 'foobar') <-- nur dynamisch...

Ich habe es mit
  $bar = new foo(eval(implode(', ', $foo)));
versucht, aber das klappt nicht.
Weiß jemand wie ich dies bewerkstelligen kann?

Ich möchte _nicht_ den Array in der Klasse "verarbeiten".

Liebe Grüße,
    Till

  1. Hallo Till,

    Ich habe eine Klasse:
      foo($bar, $foobar)

    Ich habe eine Datei mit einem Array:
      $foo = array('bar', 'foobar')

    Ich möchte nun die Klasse mit den Parametern aus dem Array aufrufen
      $bar = foo('bar', 'foobar') <-- nur dynamisch...

    Ich habe es mit
      $bar = new foo(eval(implode(', ', $foo)));
    versucht, aber das klappt nicht.
    Weiß jemand wie ich dies bewerkstelligen kann?

    Ich möchte _nicht_ den Array in der Klasse "verarbeiten".

    Für Funktionen in PHP gibt es dazu eine Funktion namens call_user_func(), allerdings schafft diese es nicht Klassenmethoden aufzurufen.
    Für Klassenmethoden steht aber auf der gleichen Seite etwas weiter unten in den Kommentaren drin wie man es dort machen kann, such mal nach "$ClassToUse"...

    Wir lesen uns!

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    SELFCode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Hi !

      Für Klassenmethoden steht aber auf der gleichen Seite etwas weiter unten in den Kommentaren drin wie man es dort machen kann, such mal nach "$ClassToUse"...

      Ich hab mir das gerade durchgelesen... Das hatte ich bereits in meiner Funktion drin:

      public function load_module($name, $cname, $args = NULL) {

      [...schnipp...]

      if (is_array($args)) {
         $$cname = new $name(eval(implode(', ', $args)));
        } elseif(is_null($args)) {
         $$cname = new $name();
        } else {
         $$cname = new $name($args);
        }

      return $$cname ? TRUE : FALSE;

      [...schnipp...]

      }

      Naja, muss ich mir was anderes überlegen.

      Grüße, Till

      1. Hallo Till,

        so wie ich das ganze jetzt verstanden habe glaube ich nicht, dass dein Vorhaben so wie du es willst realisierbar ist - zumindest nicht mit call_user_func() oder dem von Patrick vorgeschlagenen call_user_method().

        Aber vielleicht geht es doch mit der eval-Methode, ich glaube sogar dass dein bisheriger Aufruf falsch war:

        $bar = new foo(eval(implode(', ', $foo)));
        Das sollte dann folgendermaßen ausgeführt werden:
        $bar = new foo(bar, foobar)));

        Eine richtige Ausführung der Variablen aber geht eigentlich so:
        $bar = new foo($bar, $foobar)));

        D.h. du musst dein Array so definieren (oder nachträglich ändern), dass es das Variablenzeichen $ vor dem Namen der Variable hat - also etwa so:
        $foo = array("$bar", "$foobar");

        Vielleicht konnte deshalb die Methode nicht ausgeführt werden?

        Und wenn es damit nicht klappt, versuch doch mal den kompletten Methodenaufruf in einen (dynamisch generierten) String zu stecken - ich bin mir sicher dass es dann funktionieren sollte!

        Grüße

        Marc Reichelt || http://www.marcreichelt.de/

        --
        Linux is like a wigwam - no windows, no gates and an Apache inside!
        SELFCode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
        http://emmanuel.dammerer.at/selfcode.html
    2. Hallo Marc,

      Für Funktionen in PHP gibt es dazu eine Funktion namens call_user_func(), allerdings schafft diese es nicht Klassenmethoden aufzurufen.

      Kennst du call_user_method()?

      Viele Grüße
        Patrick Canterino

      --
      "Es gibt nur eine Möglichkeit: Sieg, Unentschieden oder Niederlage!" (Franz Beckenbauer)
  2. Hallo Till,

    Ich habe eine Klasse:
      foo($bar, $foobar)

    Ich habe eine Datei mit einem Array:
      $foo = array('bar', 'foobar')

    Ich möchte nun die Klasse mit den Parametern aus dem Array aufrufen
      $bar = foo('bar', 'foobar') <-- nur dynamisch...

    Ich habe es mit
      $bar = new foo(eval(implode(', ', $foo)));
    versucht, aber das klappt nicht.
    Weiß jemand wie ich dies bewerkstelligen kann?

    Ich möchte _nicht_ den Array in der Klasse "verarbeiten".

    Nachdem ich mein letztes Posting abgesetzt hatte, war ich noch unzufrieden - Probleme informatischer Art ziehen mich aber magisch an und lassen mich nicht mehr los, also habe ich versucht dein Vorhaben an einem Beispiel umzusetzen. Ich habe etwa 20 Minuten gebraucht, aber jetzt hab ich das Problem gelöst (auch wenn es ein ziemlich blöder Hack ist).
    Folgenden Code kannst du mal ansehen und austesten:

    ---schni schna schnappi---
    <?php
     // Array mit Werten erzeugen - das müssen hier alles Strings sein!
     $foobar = Array("Hallo", " Welt!");

    // eine einfache Funktion, die alle übergebenen Strings zusammenfügt
     function addStrings()
     {
      $result = "";
      for($i=0; $i<func_num_args(); $i++)
      {
       $result .= func_get_arg($i);
      }
      return $result;
     }

    // Anführungszeichen vor und nach dem Inhalt der Elemente des Arrays einfügen
     for($i=0; $i<count($foobar); $i++)
     {
      $foobar[$i] = """.$foobar[$i].""";
     }

    // Befehl ausführen
     eval( "echo addStrings(" .implode(", ", $foobar). ");" );

    // ...und noch eine neue Zeile, damit meine Shell nicht so blöd aussieht ;-)
     echo "\n";
    ?>
    ---schnappi schnappi schnapp---

    Was sehen wir denn da? Ein einfaches "Hallo Welt!" - mir fiel einfach gerade nichts anderes ein ;-)
    Besser aber wäre es, wenn du gleich bei der Deklaration des Arrays alle Zeichen mitaufnimmst, denn mein Beispiel enthält keine Fehlerkontrolle, geschweige denn Typenerkennung.
    Mein Beispiel funktioniert nur mit Strings, besser wäre es wenn du auf den automatisierten Teil verzichtest, also den hier:
     for($i=0; $i<count($foobar); $i++)
     {
      $foobar[$i] = """.$foobar[$i].""";
     }

    Dafür musst du dann oben die Arraydeklaration anpassen, und zwar so wie deine Werte es haben wollen. Statt
     $foobar = Array(2, 0, 0, 5, " - Firefox schlägt alle Rekorde");   // funktioniert nicht mit dem obigen Code
    müssen wir dann das hier schreiben:
     $foobar = Array("2", "0", "0", "5", "" - Firefox schlägt alle Rekorde"");

    Um noch genauer zu sein müssen wir den String noch mit addslashes() markieren, bevor wir die Anführungszeichen außen dransetzen.

    Das Problem ist also gelöst.
    Jetzt stell dir aber bitte eine Frage: Was ist einfacher, diesen Code zu benutzen und eine Menge an Fehlerausnahmen zu betrachten oder lieber einen winzigen Code für das Array in die Klassenmethode hineinbauen? ;-)

    Bis dann!

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    SELFCode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. Holla!

      Mhhhhh... Mir war deine Methode wirklich zu umständlich : )

      Nun hab ich es so gemacht:
          $$name = new $module((is_null($args) ? NULL : $args));

      Danke für deine Mühen :D