Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Alternative zu eval [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-webhosting
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Alternative zu eval


 
MrMind
08-12-2004, 00:43 
 
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

<!-- BEGIN blockname -->

Blockende

<!-- 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.

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 < 2 )
{
$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

 
asp2php
08-12-2004, 08:54 
 
IMHO ist die einzige Alternative, dass du anstatt Code in den Platzhaltern direkt die Werte einsetzst.

 
mrhappiness
08-12-2004, 10:08 
 
oder du kompilierst das template

 
ghostgambler
08-12-2004, 10:33 
 
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

 
MrMind
08-12-2004, 14:50 
 
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

 
mrhappiness
08-12-2004, 14:57 
 
im code steht$template->add_var('wem_will_ich_hallo_sagen', 'Welt');
im template stehtHallo {wem_will_ich_hallo_sagen}!
im kompilierten template steht: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)

 
MaxP0W3R
09-12-2004, 17:21 
 
Original geschrieben von mrhappiness
im code steht$template->add_var('wem_will_ich_hallo_sagen', 'Welt');
im template stehtHallo {wem_will_ich_hallo_sagen}!
im kompilierten template steht: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.


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:25 Uhr.