Seite 1 von 2
[erledigt]eval :-(
Verfasst: 16.11.2006 17:55
von Ambience
Code: Alles auswählen
/**
*
* compile the template
*
* @access private
* @param string $handle
*
**/
private function compile($handle)
{
$code = file($this->root . $this->file[$handle]);
$code = implode('', $code);
//
// parse single assigns
//
$code = preg_replace('/\{(.*?)\}/is', '<?php (isset($this->assigns["$1"])) ? $this->assigns["$1"] : ""; ?>', $code);
eval($code);
return true;
}
Parse error: parse error, unexpected '<' in C:\Programme\xampp\htdocs\xxx\includes\template.php(168) : eval()'d code on line 1
Es handelt sich nicht um ein phpbb..
Verfasst: 16.11.2006 18:07
von Olli Oberhausen
Da du ja anscheinend unter die hardcoreentwickler gehst, solltest du dir mal das Zend Studio besorgen, damit findest du solche fehler in echtzeit...
1. Das <?php und ?> muß weg ; muß bleiben.
2. im geparsten String fehlt ein echo
Olli
Verfasst: 16.11.2006 18:14
von Ambience
1. und 2. funktioniert irgendwie nicht:
Code: Alles auswählen
//
// parse single assigns
//
$code = preg_replace('/\{(.*?)\}/is', 'echo (isset($this->assigns["$1"]) ? $this->assigns["$1"] : "");', $code);
zend studio habe ich schon oft versucht, aber der findet meinen xampp nie odersowas.
Und wie meinst du das mit haardcore? ich hab das früher mit echo statt eval gemacht, bis mir einer erklärte das ich eval nehmen MUSS, da ein echo in funktionen fehlamplatz sei...
Danke
Re: eval :-(
Verfasst: 16.11.2006 18:18
von Banger
Herrje... mach dat doch gescheit!
Code: Alles auswählen
/**
*
* compile the template
*
* @access private
* @param string $handle
*
**/
private function getAssign($r)
{
$k = &$r[1];
return isset($this->assigns[$k]) ? $this->assigns[$k] : '';
}
private function compile($handle)
{
$code = file_get_contents($this->root . $this->file[$handle]);
//
// parse single assigns
//
return preg_replace_callback('/\{(.*)\}/is', array(&$this, 'getAssign'), $code);
}
Verfasst: 16.11.2006 18:26
von Ambience
aber jetzt weiß ich nicht genau was ich genau falsch gemacht habe, und dein code versteh ich auch nicht so recht.
also preg_replace_callback(meinesuche, meinfunctionsaufrufbeigefunden, von code);
soweit komm ich mit.. aber was ist an meinem genau falsch gelaufen? ich kenne eval nicht und bei php.net hab ich auch nichts in meinem zusammenhang gefunden.
Ich versteh hier gerade nix. aber funktionieren tut es
und funktionieren tut es bisher auch nur mit echo $this->compile(); also der rückgabewert des return von der compile funktion.
so sieht das ding nun aus:
Code: Alles auswählen
function display($handle)
{
if ($handle != '')
{
if (isset($this->file[$handle]))
{
echo $this->compile($handle);
return true;
}
else
{
die('Template->display(): You have to add the template before display');
}
}
else
{
return false;
}
}
/**
*
* get all assigns for compile
*
**/
private function getAssign($r)
{
$k = &$r[1];
return isset($this->assigns[$k]) ? $this->assigns[$k] : '';
}
/**
*
* compile the template
*
* @access private
* @param string $handle
*
**/
private function compile($handle)
{
$code = file_get_contents($this->root . $this->file[$handle]);
//
// replace \ with \\ and then ' with \'
//
$code = str_replace('\\', '\\\\', $code);
$code = str_replace('\'', '\\\'', $code);
//
// parse single assigns
//
return preg_replace_callback('/\{(.*)\}/is', array(&$this, 'getAssign'), $code);
}
und er parst nur einmal... also nicht alle {lala} sondern nur das erste..
Verfasst: 16.11.2006 21:26
von Ambience
so nun funktionierts zu meiner zufriedenheit:
Code: Alles auswählen
private function compile($handle)
{
$code = file($this->root . $this->file[$handle]);
$line_counts = count($code);
$code = implode('', $code);
//
// parse single assigns
//
while (list($k, $v) = each($this->assigns))
{
if (preg_match('/\{(' . $k . ')\}/is', $code))
{
$code = str_replace('{' . $k . '}', $v, $code);
}
else
{
$code = str_replace('{' . $k . '}', '', $code);
}
}
eval("echo '$code';");
return true;
Verfasst: 16.11.2006 22:49
von larsneo
ein schönes zitat in diesem zusammenhang:
"If eval is the answer, then you are asking the wrong question."
[
Rasmus Lerdorf]
Verfasst: 16.11.2006 23:25
von Ambience
dann sag mir wie dann?
Verfasst: 17.11.2006 00:01
von gn#36
Die Zeile
ist nicht gerade sinnvoll. eval macht ja nichts anderes, als den übergebenen String als PHP Code zu interpretieren und auszuführen. Wobei es mich ehrlich gesagt wundert dass das so funktioniert, denn in einfachen Anführungsstrichen sollten eigentlich die Variablen nicht geparst werden, aber gut. Statt der Anweisung könntest du also auch direkt echo $code; schreiben. Eval kostet hier nur unnötig Zeit.
Verfasst: 17.11.2006 09:43
von Olli Oberhausen
Eval ist schon der richtige ansatz, macht nur bei einer template klasse deiner größe (noch) keinen sinn.
Wenn du dir mal das phpbb oder das extremestyles template ansiehst macht es schon sinn.
Da wird der code in zig kleinen schritten zusammengebaut und erst am ende ausgeführt.
Der große vorteil ist das du den Kompilierten code cachen kannst und bei seiner 2. verwendung nicht neu zusammen bauen musst. Dann holst du einfach $code von der platte und schickst es durch eval.
Mein tipp. nutze die "Perfekte" klasse von cyberalien und bastel daran rum - die kannst du ohne weiteres erweitern...
Ein paar Highlights:
Code: Alles auswählen
<!-- IF USERNAME -->Hallo {USERNAME}<!-- ELSE -->Hallo Welt<!-- ENDIF -->
<!-- INCLUDE noch_ein_template.tpl -->
<?php echo 'php im template möglich'; ?>
usw... usw...
Olli