Ja ^^ wobei ich das mit eval irgendwie mal richtig verstehen möchte -.-
Irgendwie schaff ich dass zwar, aber hab keinen plassen Schimmer davon ...
Hat geholfen -.- danke nochmal
Vorsicht: off-topic
Hallo!
Dann versuch ich mal die Funktion [phpf]eval[/phpf] zu erklären...
Also: Vereinfacht, bzw. zum besseren Verständnis kann man sagen, dass alles, was der eval-Funktion als Parameter übergeben wird, in den Rumpf einer Funktion geschrieben wird.
Aus folgendem:
PHP:
eval("echo \"Hallo!\";");
wird folgendes:
PHP:
function execMyCode() {
echo "Hallo!";
}
Dabei wird auch klar, dass man eval() z.B. nicht einfach den Quellcode einer PHP-Datei übergeben kann. Denn sonst würde die generierte Funktion (z.B.) so aussehen:
PHP:
function execMyCode() {
<html>
<?php
loadHead();
loadBody();
?>
</html>
}
Das ist syntaktisch natürlich absoluter Blödsinn!
Bleibt man bei der Annahme, dass PHP eine Funktion generiert, so wird auch deutlich, dass ein return innerhalb derer die Ausführung des an eval() übergebenen Codes unterbrochen wird:
PHP:
eval("echo \"Foo\"; return; echo \"Bar\"");
Die Ausgabe wäre hier: Foo
Vor der Ausgabe von "Bar" wird die Ausführung der "Funktion" ja abgebrochen.
So, bei return gibt es allerdings etwas zu beachten: Bei älteren Versionen von PHP (3 und abwärts) hat die eval()-Funktion keinen Rückgabewert. Das heißt jedes return innerhalb von eval(), würde die Ausführung zwar unterbrechen, jedoch nichts zurückgeben - auch wenn etwas spezifiziert wurde. Zum besseren Verständnis:
PHP:
$str = eval("return \"test\";");
var_dump($str); // in PHP3 und abwärts hätte $str den Wert NULL.
// in PHP4 und aufwärts hätte $str den Wert "test"
$str = eval("return;");
var_dump($str); // in allen PHP-Versionen hätte $str den Wert NULL.
Ich habe gerade das Gerücht in die Welt gesetzt, dass der in eval()-stehende Code zu einer Funktion übersetzt wird.
Das ist natürlich nicht richtig, sondern sollte nur dem Verständnis gelten! Es kann auch gar nicht so sein - denn was unterscheidet eine "von eval() generierte Funktion" von einer normalen Funktion? Innerhalb von eval() kann auf Variablen zugegriffen werden, auch wenn diese außerhalb deklariert werden! Auf in eval() deklarierte Variablen kann auch von außen nach der eval()-Ausführung zugegriffen werden!
Was ergibt z.B. folgendes?
PHP:
<?php
$str = "Das ist ein Test!<br/>";
// Die Backslashes sind notwendig, weil ansonsten der Inhalt der Variablen
// als solcher in den Quelltext einfließen würde... Optional kann man
// die Backslashes auch weglassen und stattdessen den gesamten
// Code innerhalb von eval() mit einfachen Anführungszeichen ' versehen.
$retVal = eval("echo \$str; \$str = \"Dies ist ein weiterer Test.\"; return \"Ein Wert.\"; \$str = \"Diese Stelle wird nicht erreicht!\";");
echo $str;
echo $retVal;
?>
Dies würde folgende Ausgabe erzeugen:
Code:
Das ist ein Test!
Dies ist ein weiterer Test.
Ein Wert.
In PHP3 und abwärts, gäbe es allerdings diese Ausgabe:
Code:
Das ist ein Test!
Dies ist ein weiterer Test.
Ein NULL-Wert würde nicht ausgegeben werden!
Soviel dazu... ich hoffe, ich hab jetzt nicht für noch mehr Verwirrung gesorgt und konnte etwas Licht ins Dunkle bringen
Gruß
split