PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Welchen Sinn hat eval() im Templating?
#1
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
Antworten
#2
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, " 
Antworten
#3
Ok, danke Marc.
Dann wird es etwas filigraner, das auszutauschen, aber was soll's, muß ja auch Spaß bringen... Big Grin

Danke
Antworten
#4
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
Antworten
#5
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
Antworten
#6
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
Antworten


Gehe zu: