pl: Funktionen namentlich aufrufen

s. Thema. Mein switch sieht so aus:

   switch( $name ) {
     case 'init':    $this->init(); break;
     case 'browse':  $this->browse(); break;
     case 'control': $this->control(); break;
     default: break;
   }

also ich kriege das $name in eine Funktion übergeben und aus dieser Funktion heraus soll dann eine Methode mit genau diesem Namen aufgerufen werden.

Wie geht das direkt ohne switch?

MFG

  1. Tach!

    s. Thema. Mein switch sieht so aus:

       switch( $name ) {
         case 'init':    $this->init(); break;
         case 'browse':  $this->browse(); break;
         case 'control': $this->control(); break;
         default: break;
       }
    

    also ich kriege das $name in eine Funktion übergeben und aus dieser Funktion heraus soll dann eine Methode mit genau diesem Namen aufgerufen werden.

    Wie geht das direkt ohne switch?

    Über variable Variablen und/oder variable Functions. Ist aber keine gute Vorgehensweise, weil das nicht statisch analysiert werden kann, und man dafür keine Unterstützung seitens der IDE oder anderen Analyseprogrammen bekommt. Probleme kommen erst zur Laufzeit ans Tageslicht.

    dedlfix.

    1. Ah danke, also $this->name();

      Was die Haptik betrifft: In Perl würde man per $coderef = $this->can($name) prüfen ob es die Methode namens $name gibt und hätte dann $this->coderef() zum Ausführen.

      MFG

      1. Nein, sondern so.

        Rolf

        --
        sumpsi - posui - clusi
    2. Hallo dedlfix,

      ich stimme Dir zu, dass der Dev-Toolstack hier nicht mehr viel Unterstützung bietet. Deswegen sollte man das nur tun, wenn man unbedingt muss, z.B. für einen Router von Controller/Action URLs. (1) Instanziiere den Controller sofern die Klasse existiert und (2) Rufe die Action sofern die Methode existiert.

      Wenn (1) oder (2) schief gehen, muss das nicht unbedingt ein Programmierfehler sein. Genauso gut kann irgendein Script Kiddie URLs durchprobieren um versteckte Controller oder Actions zu finden. Daran muss man beim Bau solcher Dinge immer denken.

      Rolf

      --
      sumpsi - posui - clusi
  2. Hallo pl,

    $foo = "bar";
    $obj->$foo();
    //    ▲
    

    Risiko: Gibt's bar nicht, bricht dein Script ab.

    In PHP 7 könntest Du das über try/catch (Error ...) absichern. Aber Du hast ja 5.3. Der STFU Operator hilft nicht - da siehst Du zwar den Fatal Error nicht, aber das Script bricht trotzdem ab.

    Lösung 1: method_exists
    Lösung 2: __call

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo,

      $foo = "bar";
      $obj->$foo();
      //    ▲
      

      Risiko: Gibt's bar nicht, bricht dein Script ab.

      Kein Risiko: Weiter oben sicherstellen, daß es die Methode(n) gibt. Und __call hab ich schon anderweitig verheizt.

      MFG

  3. Lieber pl,

    if (method_exists($this, $name)) {
      $this->$name();
    }
    

    (ungetestet)

    Liebe Grüße

    Felix Riesterer

    1. Ja, das geht einwandfrei. Wobei ich hardcoded sicherstelle, daß es die namentlich übergebenen Funktionen auch gibt. Ansonsten ist es immer eine gute Idee zu prüfen.

      MFG