Alternative zu eval

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Alternative zu eval

    Moin Leutz,


    Ich habe ein kleines Tutorial über eine abgespeckte und erweiterte Template-Klasse vom phpBB geschrieben.

    Wer das Tutorial gerne mal sehen will:

    www.proggen.net/thread.php?threadid=1185

    Da wurde auch unteranderem angesprochen, das eval() nur in Schleifen wirklich effektiv sein und bei meiner Anwendung eher eine Performanc-Last.

    Ich habe nun einige Tage darüber gerätselt wie ich das eval() in der Methode Parse() umgehen kann, sprich eine alternative zu eval().

    Ich benötige ja eval() dazu, weil ich Blöcke in den Templates nutzen will, damit diese später mehrach Ausgegeben werden kann. Sprich:

    Blockanfang

    Code:
    <!-- BEGIN blockname -->
    Blockende

    Code:
    <!-- END blockname -->
    Alles was dazwischen steht ist als ein Block anzusehen und der HTML-Code dazwischen soll dann bei bedarf auch mehrfach hintereinander ausgegeben werden. Damit sollen mehrere Templates mit nur einer oder ein paar HTML-Code-Zeilen vermieden werden.

    So nun tut die Parse() Methode dieses HTML-Kommentar durch eine FOR-Schleife ersetzen, die dann durch eval() ausgeführt wird.

    PHP-Code:
    function parse($handle)
      {
         if( !
    $this->filename[$handle] )
         {
            echo 
    "template->parse(): $handle ist nicht vorhanden.";
            return 
    false;
         }
         
         if( 
    $this->db_use )
         {
            
    $sql "SELECT " $this->db_code_segment " FROM " $this->db_table " WHERE " $this->db_search_field "='" $this->filename[$handle] . "'";
            if( !
    $result mysql_query($sql) )
            {
               echo 
    "template->parse(): Konnte Codesegment nicht laden.";
               return 
    false;
            }
            
            
    $str mysql_fetch_array($result);
            
    $str $str[0];
         }
         else
         {
             
    $str implode("",@file($this->filename[$handle]));
         }
         
         if( empty(
    $str) )
         {
            echo 
    "template->parse(): " $this->filename[$handle] . " ist leer";
            return 
    false;
         }
         
         
    $str str_replace('\'''\\\''$str);
         
    $str str_replace('\\''\\\\'$str);
         
         
    $matchcount preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is',$str,$matchs);
         
         for(
    $i=0$i $matchcount$i++)
         {
            
    $blockname $matchs[1][$i];
            
    $blockindex $matchs[3][$i];
            
            
    $blockname substr($blockname,0,strlen($blockname) - 1);

            
    $str_to_eval $this->getBlockRef($blockname,true);
            
            
    $str_to_eval .= '[\'' $blockindex '\']';
            
    $str_to_eval '\' . ( (isset(' $str_to_eval ') ) ? ' $str_to_eval ' : \'\') . \'';
            
            
    $str str_replace($matchs[0][$i], $str_to_eval$str);
         }
         
         
    $str preg_replace('#\{([a-z0-9\-_]*?)\}#is''\' . ( ( isset($this->blocks[\'.\'][0][\'\1\']) ) ? $this->blocks[\'.\'][0][\'\1\'] : \'\' ) . \''$str);
         
         
    $str_zeilen explode("\n"$str);
         
         
    $str_zeilen_count count($str_zeilen);
         
         
    $block_counter 0;
         
    $block_name_array = array();
         
    $block_name_array[0] = '.';
         
         for( 
    $i=0$i $str_zeilen_count$i++)
         {
            
    $str_zeilen[$i] = chop($str_zeilen[$i]);
            
            if( 
    preg_match('#<!-- ' $this->block_begin ' (.*?) -->#si'$str_zeilen[$i], $treffer) )
            {
               
    $bn $treffer[1];
               
               
    $block_counter++;
               
    $block_name_array[$block_counter] = $bn;
               
               if( 
    $block_counter )
               {
                  
    $str_zeilen[$i] = '$' $bn '_count = ( isset($this->blocks[\'' $bn '.\']) ) ? count($this->blocks[\'' $bn '.\']) : 0;';
                  
    $str_zeilen[$i] .= "\n" 'for( $' $bn '_i = 0; $' $bn '_i < $' $bn '_count; $' $bn '_i++)';
                  
    $str_zeilen[$i] .= "\n" '{';
               }
               else
               {
                  
    $blocks_namespace substr(implode('.',$block_name_array),2);

                  
    $blocks_ref $this->getBlockRef($blocks_namespace,false);
                  
                  
    $str_zeilen[$i] = '$' $bn '_count = ( isset(' $blocks_ref ') ) ? count(' $blocks_ref ') : 0;';
                  
    $str_zeilen[$i] .= "\n" 'for( $' $bn '_i = 0; $' $bn '_i < $' $bn '_count; $' $bn '_i++)';
                  
    $str_zeilen[$i] .= "\n" '{';
               }
            }
            else if( 
    preg_match('#<!-- ' $this->block_end ' (.*?) -->#si'$str_zeilen[$i], $treffer) )
            {
               unset(
    $block_name_array[$block_counter]);
               
    $block_counter--;
               
               
    $str_zeilen[$i] = '}';
            }
            else
            {
               
    $str_zeilen[$i] = 'echo \'' $str_zeilen[$i] . '\' . "\\n";';
            }
         }
         
         
    $str implode("\n",$str_zeilen);
         
         eval(
    $str);
         return 
    true;
      } 
    Ich würde gerne ne alternative zu eval() wissen, da ich nach langer Überlegung keine gefunden habe.

    Mfg
    MrMind
    Zuletzt geändert von MrMind; 08.12.2004, 00:51.

  • #2
    IMHO ist die einzige Alternative, dass du anstatt Code in den Platzhaltern direkt die Werte einsetzst.

    Kommentar


    • #3
      oder du kompilierst das template
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        Re: Alternative zu eval

        Original geschrieben von MrMind
        Da wurde auch unteranderem angesprochen, das eval() nur in Schleifen wirklich effektiv sein und bei meiner Anwendung eher eine Performanc-Last.
        Schonmal nen Zeittest gemacht, ob das wirklich stimmt? Ich kann mir das eigentlich nicht vorstellen......es läuft ja unter PHP, dann sollte es für den Parser kein Problem sein den Inhalt eines Strings durchzugehen.....
        aber ich kann mich ja auch irren XD

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          Re: Re: Alternative zu eval

          Original geschrieben von ghostgambler
          Schonmal nen Zeittest gemacht, ob das wirklich stimmt? Ich kann mir das eigentlich nicht vorstellen......es läuft ja unter PHP, dann sollte es für den Parser kein Problem sein den Inhalt eines Strings durchzugehen.....
          aber ich kann mich ja auch irren XD
          Jo werd ich jetzt auch machen. Ich denke aber mal das bei kleinen Templates es nicht auffällt. Naja ich schau mal und poste mal die Zeit.


          @asp2php

          Naja dann kann ich allerdings die Funktionalität vergessen, da die Blöke ja mehrfach ausgeführt werden können/sollen.

          @mrhappiness

          Wie meinste das mit dem kompilieren (kenne das jetzt nur aus der Programmierung mit C/C++ bzw. Java).

          Mfg
          MrMind

          Kommentar


          • #6
            im code steht
            PHP-Code:
            $template->add_var('wem_will_ich_hallo_sagen''Welt'); 
            im template steht
            Code:
            Hallo {wem_will_ich_hallo_sagen}!
            im kompilierten template steht:
            PHP-Code:
            Hallo <?php echo $template->get_var('wem_will_ich_hallo_sagen'); ?>!
            denk mal drüber nach, mir persönlich gefällt die idee und bei mir läuft sie auch ganz gut (vom prinzip her)
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Original geschrieben von mrhappiness
              im code steht
              PHP-Code:
              $template->add_var('wem_will_ich_hallo_sagen''Welt'); 
              im template steht
              Code:
              Hallo {wem_will_ich_hallo_sagen}!
              im kompilierten template steht:
              PHP-Code:
              Hallo <?php echo $template->get_var('wem_will_ich_hallo_sagen'); ?>!
              denk mal drüber nach, mir persönlich gefällt die idee und bei mir läuft sie auch ganz gut (vom prinzip her)
              ja das gefällt mir auch sehr gut

              das Template smarty machts ja genau so oder ?

              es schaut, ob sich ein template geändert hat, wenn nein wird das alte genommen, wenn ja wird das template in eine php datei geparsed, die dann ausgeführt wird.

              falls ich mal wieder php oden werde, werde ich das auch so umsetzen.


              An mich bitte keine unaufgeforderten E-Mails senden (ausser ihr seid bereit geld zu zahlen, dann gerne )

              Kommentar

              Lädt...
              X