Mhm, wieso geht denn sowas nicht?

-GS-Master

Erfahrenes Mitglied
PHP:
<?php
$Design = file_get_contents ('Layout.php');
$Design = str_replace("{SEARCH}", "<?php include('search.php'); ?>", $Design);
echo $Design;
?>

Ich glaube es merkt sofort jeder was ich versucht habe -.-
Wollte statt dem Platzhalter ein Script includen lassen, jedoch wird mir bloß die PHP-Zeile in den Quellcode geschrieben --> jedoch nicht ausgeführt!

Hoff ihr könnt mir sagen wie ich es anstellen müsste um mein Ziel zu erreichen.
 
file_get_contents() lädt einfach nur den Inhalt einer Datei - ohne ihn zu parsen. Dann schreibst du zwar einen PHP-Befehl hinein, dieser wird allerdings nur als String gewertet! Du kannst das (denke ich) folgendermaßen lösen:
PHP:
<?php
   
   // Den Inhalt der ausgeführten search.php in eine Variable schreiben...
   ob_start();
   include_once "search.php";
   $cnt = ob_get_clean();

   // Datei laden und entsprechende Stelle ersetzen
   $design = file_get_contents("Layout.php");
   echo str_replace("{SEARCH}", $cnt, $design);
?>
Ansonsten könntest du natürlich auch die Datei Layout.php in zwei Hälften aufsplitten und dazwischen den include()-Befehl ausführen:
PHP:
<?php
   $design = file_get_contents("Layout.php");
   $spl = explode("{SEARCH}", $design);
   echo $spl[0];
   include "search.php";
   echo $spl[1];
?>
Beides sicher nicht die elegantesten Lösungen, aber sie (sollten) funktionieren - auch ohne dass ich das jetzt ausprobiert habe...

Allerdings gibt es viel bessere Lösungen für Templates o.ä...
 
Oder auf [phpf]eval[/phpf] zurückgreifen, wenn es denn wirklich dieser Weg sein muss.
 
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
 
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
 
Zurück