Sebastian: Variable in Funktionsnamen verwenden?

Hallo,

  
while (list($key_arr_zeit,$value_arr_zeit) = each($arr_zeit))  
{  
if ($relevantes_datum > $value_zeit) {  
nimm_funktion_$key_arr_zeit($value_zeit);  
}  
}  

Hier würde ich gerne $key_arr_zeit in den Funktionsnamen einbauen, um später die Funktionen

nimm_funktion_1
nimm_funktion_2 usw.

bedienen zu können.

Geht sowas?

Mir ist klar, daß ich auch mit einer einzigen Funktion klar kommen kann und $key_arr_zeit als übergebenen Parameter auswerten könnte.

Es ist mehr eine Syntaxfrage für mich, ob sowas prinziell gehen würde oder nicht.

Seb

  1. Moin,

    Geht sowas?

    Meines Wissens ja.

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. Moin,

      Geht sowas?

      Allerdings nur, wenn der gesamte Funktionsname in der Variable steht.

      Funktioniert:

      function name1() { print 'You called name1'; }  
        
      $foo = "name1";  
      $foo();  
      
      

      Funktioniert NICHT:

      function name1() { print 'You called name1'; }  
        
      $foo = 1;  
      name$foo();
      

      Funktioniert auch:

      function name1() { echo "You called name1"; }  
      function name2() { echo "You called name2"; }  
      function name3() { echo "You called name3"; }  
      function name4() { echo "You called name4"; }  
        
        
      for($i=1;$i<=4;$i++) {  
          $bar = "name".$i;  
          $bar();  
      }
      

      Grüße Marco

      --
      Ich spreche Spaghetticode - fließend.
      1. Moin,

        ... nämlich mit dynamischen Variablen:

        function foobar() { echo "FooBar"; }  
        $func = "foobar";  
        $caller = "func";  
        $$caller();
        

        Das ist doch krank oder?^^

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
        1. Hello,

          ... nämlich mit dynamischen Variablen:

          function foobar() { echo "FooBar"; }

          $func = "foobar";
          $caller = "func";
          $$caller();

          
          > Das ist doch krank oder?^^  
            
          Das wäre wirklich krank, weil es die Übersichtlichkeit und Verständlichkeit eines Programms erheblich stört. Die Methode mit den Arrays wäre da schon transparenter.  
            
          Der nächste Schritt wäre dann die OOP, die aber nicht unbedingt notwendig ist, aber in PHP die Abgrenzung der Namensräume ermöglicht.  
            
            
          Man sollte auf jeden Fall noch die Funktion  
            
          <http://de3.php.net/manual/en/function.function-exists.php>  
            
          verwenden, bevor der Aufruf stattfindet. Das kann man aber alles automatisieren.  
            
            
            
            
            
          Liebe Grüße aus dem schönen Oberharz  
            
            
          Tom vom Berg  
          ![](http://selfhtml.bitworks.de/Virencheck.gif)  
            
          
          -- 
           ☻\_  
          /▌  
          / \ Nur selber lernen macht schlau  
          <http://bikers-lodge.com>
          
          1. Das wäre wirklich krank, weil es die Übersichtlichkeit und Verständlichkeit eines Programms erheblich stört.

            Reflections sind meist der Tod der Übersichtlichkeit und Verständlichkeit (da das eine ohne das andere gar nicht existieren kann, was unübersichtlich ist versteht man nicht, und wenn's unverständlich ist hilft einen auch die Übersichtlichkeit nicht mehr und man darf von vorn anfangen zu planen oder weiter trash code schreiben) ;p

            MfG
            bubble

            --
            If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      2. (Ergänzung)

        geht auch:

        <?php  
        $foo= function() { print 'You called $foo' . "\n"; };  
        $foo();  
        ?>
        

        ausgeführt:

        fastix@trainer:/tmp$ php test.php  
        You called $foo
        

        Jörg Reinholz

        1. <?php

          $foo= function() { print 'You called $foo' . "\n"; };
          $foo();
          ?>

            
          Als Ergänzung bringe ich hier mal an, dass hier nicht mit durch einen String eine Funktion repräsentiert wird, sondern eine Funktionsreferenz in einer Variablen gespeichert wird. Das ist schließlich ein großer Unterschied.  
            
            
          MfG  
          bubble
          
          -- 
          If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
          
  2. Hello,

    while (list($key_arr_zeit,$value_arr_zeit) = each($arr_zeit))
    {
    if ($relevantes_datum > $value_zeit) {
    nimm_funktion_$key_arr_zeit($value_zeit);
    }
    }

    
    >   
    > Hier würde ich gerne $key\_arr\_zeit in den Funktionsnamen einbauen, um später die Funktionen  
    >   
    > nimm\_funktion\_1  
    > nimm\_funktion\_2 usw.  
    >   
    > bedienen zu können.  
      
    That makes man better annersch ;-))  
      
    <http://forum.de.selfhtml.org/archiv/2007/4/t150137/#m975464>  
    <http://selfhtml.bitworks.de/artikel_datenstrukturen/function_reference.php.txt>  
      
    Das hat den Vorteil, dass man so polymorph arbeiten kann.  
    Angenommen, du baust verschiedene Informationsseiten auf und willst daraus auf relavente Teile drucken lassen. Die Druckfunktion heißt immer genause, wird aber immer anders implementiert. Das ist dann "OOP durch die Hintertür".  
      
      
    $\_page[1]['print'] = 'print\_doc\_docname\_1';  
    $\_page[2]['print'] = 'print\_doc\_docname\_2';  
      
    usw.  
      
    Aufruf:  
    $\_page[1]['print']($attrib = 'quer', $printer = 'lexmark');  
      
    Und wenn man nun die "Seiten" in Modulen verpackt, von denen immer nur eins pro Roundturn aktiv sein kann (z. B. von der index.php geladen wird), dann kann man (am Anfang) die allgemeinen Funktionen "überschreiben".  
      
      
      
      
      
      
    Liebe Grüße aus dem schönen Oberharz  
      
      
    Tom vom Berg  
    ![](http://selfhtml.bitworks.de/Virencheck.gif)  
      
    
    -- 
     ☻\_  
    /▌  
    / \ Nur selber lernen macht schlau  
    <http://bikers-lodge.com>
    
    1. http://selfhtml.bitworks.de/artikel_datenstrukturen/function_reference.php.txt

      <klugscheiß>…_reference ... du benutzt da nicht eine Referenz auf die Funktion.
      Sondern Reflexion!</klugscheiß>

      Das hat den Vorteil, dass man so polymorph arbeiten kann.
      … "OOP durch die Hintertür".

      $_page[1]['print'] = 'print_doc_docname_1';
      $_page[2]['print'] = 'print_doc_docname_2';
      Aufruf:
      $_page[1]['print']($attrib = 'quer', $printer = 'lexmark');

      IMO wäre hier "richtiges" OOP besser, dann kann man z.B. auch Sachen wie typ hints verwenden und bekommt bessere Fehlermeldungen (im Fehlerfall).

      Als Beispiel:
      In der Reflexionsvariante. Die String-Variable wird gesetzt, es kommt aber erst beim Aufruf zur Fehlermeldung. Die Fehlersuche wird langwierig sein, je nach dem wo überall die Variable gesetzt werden kann, in der der Name der Funktion steht.

      Im Falle von OOP wirst du direkt bei der Erzeugung der nicht vorhandenen Controller-Klasse auf die Schnauze fallen und weißt, dass der Fehler nicht all zu fern sein kann.

      MfG
      bubble

      --
      If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
      1. Hello,

        http://selfhtml.bitworks.de/artikel_datenstrukturen/function_reference.php.txt
        <klugscheiß>…_reference ... du benutzt da nicht eine Referenz auf die Funktion.
        Sondern Reflexion!</klugscheiß>

        Das hat den Vorteil, dass man so polymorph arbeiten kann.
        … "OOP durch die Hintertür".

        $_page[1]['print'] = 'print_doc_docname_1';
        $_page[2]['print'] = 'print_doc_docname_2';
        Aufruf:
        $_page[1]['print']($attrib = 'quer', $printer = 'lexmark');

        IMO wäre hier "richtiges" OOP besser, dann kann man z.B. auch Sachen wie typ hints verwenden und bekommt bessere Fehlermeldungen (im Fehlerfall).

        Wenn man den Aufwand will. Dazu muss man dann aber erstmal ein Klassengerüst aufbauen.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Wenn man den Aufwand will. Dazu muss man dann aber erstmal ein Klassengerüst aufbauen.

          Klar ist es mehr Aufwand, aber es ist im Endeffekt übersichtlicher, da Beziehungen zu einander "klarer" im Code stehen.

          MfG
          bubble

          --
          If "god" had intended us to drink beer, he would have given us stomachs. - David Daye
  3. Hallo,

    while (list($key_arr_zeit,$value_arr_zeit) = each($arr_zeit))
    {
    if ($relevantes_datum > $value_zeit) {
    nimm_funktion_$key_arr_zeit($value_zeit);
    }
    }

    
    >   
    > Hier würde ich gerne $key\_arr\_zeit in den Funktionsnamen einbauen, um später die Funktionen  
    >   
    > nimm\_funktion\_1  
    > nimm\_funktion\_2 usw.  
    >   
    > bedienen zu können.  
      
    Du kannst das theoretisch tun, siehe Toms Antworten. Es ist aber sehr schlechter Stil. Besser ist je nach Ziel die Übergabe per Parameter oder eine Eigene Funktion, der du das $arr\_zeit und ggf. $relevantes\_datum übergibst und die dann die Funktionalität durchführt.