PHP Rocks
Welchen Sinn hat eval() im Templating? - Druckversion

+- PHP Rocks (https://www.php-rocks.de)
+-- Forum: PHP Programmierung (https://www.php-rocks.de/https://www.php-rocks.de/forum/1-php-programmierung.html)
+--- Forum: PHP Basics (https://www.php-rocks.de/https://www.php-rocks.de/forum/2-php-basics.html)
+--- Thema: Welchen Sinn hat eval() im Templating? (/https://www.php-rocks.de/thema/64-welchen-sinn-hat-eval-im-templating-.html)



Welchen Sinn hat eval() im Templating? - Arne Drews - 10.06.2015

Hallo,

Mich stört ja schon von Anfang an, daß im Templating eval() benutzt wird.
Zwar werden damit keine Benutzereingaben ausgewertet, aber ich selbst habe eval() immer gemieden und kann mich auch heute nicht wirklich damit anfreunden.

Wenn ich folgende Zeilen sehe:
PHP-Code:
eval('$index = "'.$templates->get('index').'";'); 
ist das auf den ersten Blick für mich dasselbe, wie das hier:
PHP-Code:
$index $templates->get'index' ); 
, denn in beiden Fällen sollte $templates->get( 'index' ); ausgeführt werden.

Scheinbar wird aber im zweiten Fall das index-Template nicht geparst, Ausgabe ( gekürzt ):
Code:
{$header}
...
{$footer}

Warum ist das so?
Ich würde eval() gerne ersetzen, müsste dazu aber erstmal wissen, was die beiden Zeilen unterscheidet.
Vielleicht hat ja jemand einen geistigen Anstoß für mich?

Danke


RE: Welchen Sinn hat eval() im Templating? - mermshaus - 16.06.2015

Hat sich vermutlich schon erledigt, aber der wesentliche offensichtliche Unterschied ist, dass mit eval in dem String, der $index zugewiesen wird, Variablen expandiert werden(, sofern sie im aufrufenden Kontext existieren).

PHP-Code:
<?php

function template_get()
{
    return <<<'EOT'
($header)

($footer)
EOT;
}

$header 'Moinsen';
$footer 'Ciaosen.';


$index template_get();
var_dump($index);
    // string(20) "($header)
    //
    // ($footer)"


eval('$index = "'.template_get().'";');
var_dump($index);
    // string(21) "(Moinsen)
    //
    // (Ciaosen.)" 

Zudem kann man in der eval-Variante im Template beliebigen PHP-Code ausführen, wenn man aus dem String-Kontext ausbricht.

PHP-Code:
<?php

function template_get()
{
    return <<<'EOT'
";

for ($i = 0; $i < 10; $i++) { $index .= $i . ', '; }

"
EOT;
}

eval(
'$index = "'.template_get().'";');
var_dump($index);
    
// string(30) "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, " 



RE: Welchen Sinn hat eval() im Templating? - Arne Drews - 16.06.2015

Ok, danke Marc.
Dann wird es etwas filigraner, das auszutauschen, aber was soll's, muß ja auch Spaß bringen... Big Grin

Danke


RE: Welchen Sinn hat eval() im Templating? - Scarabaeus - 09.02.2016

Auch wenn das Thema schon gut Staub angesetzt hat, will ich noch meinen Senf dazu geben.

eval() is evil!

Das was du als Schnipsel rausgekramt hast, bezieht sich wahrscheinlich auf den internen Code von MyBB und dieser ist ziemlicher Mist (persönliche Erfahrung mit meiner Community auf MyBB-Basis). Nicht umsonst wird ja MyBB auf Basis von Laravel 5.2 derzeit komplett neu gebaut.

Was in Sachen Templating schon eher Sinn ergibt, ist die Funktion extract() wenn es darum geht Variablen in ein Template zu schleusen. Wenn man sich mal die Templating-Engines von zb. CodeIgniter oder Blade von Laravel ansieht, stößt man den den wichtigen Stellen auf eben jene Funktion. Aber auch bei der Funktion ist Vorsicht geboten und sie sollte nur im Geltungsbereich einer Funktion/Methode und schon gar nicht für Superglobale wie $_GET oder $_POST verwendet werden. Gerade letzteres ist quasi der Workaround für ein deaktivertes register_globals o_O

Grüße


RE: Welchen Sinn hat eval() im Templating? - Arne Drews - 09.02.2016

Hallo Scarabaeus,

Danke für Deinen informativen Beitrag.

Aus dem von Dir genannten Gründen hatte ich ja vor, das eval()-Templating abzulösen.
Das erschien mir allerdings etwas umfangreicher, weshalb ich beschlossen habe, eine Alternative zu entwickeln.

MyBB 2 wird auf Twig als Template-Engine basieren und wie Du schon sagst generell auf Laravel.
Es wird zwar lt. MyBB-Aussagen weiterhin eine Installation für nicht so versierte Einsteiger geben, aber ich befürchte, daß über Kurz oder lang auch das nicht mehr sein wird.
Damit wird das Aufsetzen eines Forum nur noch mit grundlegenden Kenntnissen von Frameworks und vermutlich Composer möglich sein.

Nicht jedem Einsteiger ist das imho zuzumuten. Darum halte ich weiterhin an einer Alternative fest.

Wink


RE: Welchen Sinn hat eval() im Templating? - Scarabaeus - 09.02.2016

Moin Arne,

auch ich habe in Bezug auf MyBB recht ähnliche Bedenken, wobei ich selbiges Problem schon Stefan T. gegenüber zum Ausdruck gebracht habe. Aber davon mal abgesehen ist es jetzt wahrscheinlich noch zu früh sich ein Urteil über MyBB 2 zu bilden, vorallem unter dem Hintergrund dass in dem GitHub Repo seit nem Monat - außer ganz elementaren Sachen - nichts mehr passiert.

Von deiner Alternative habe ich schon gelesen und ebenso wie du arbeite ich an meiner Alternative zu MyBB, wobei ich nicht plane jenes Projekt der Allgemeinheit zur Verfügung zu stellen, da meine Anforderungen schon an eine Spezial-Forensoftware grenzen. Big Grin

Grüße