Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP5] eval problem
UzumakiNaruto 19-07-2008, 16:05 hi leute,
evtl liegt auch nur ein verständnisproblem vor :dontknow:
Inhalt einer PHP-Datei in einen String schreiben TRUE
PHP-Code aus dem String ausführen TRUE
"Ausgabe" mittels return zurückgeben FALSE
eval gibt sofort sein ergebnis sofort aus .. aber DAS ist nicht in meinem interesse .. wüsstet ihr dort eine möglichkeit?
Den so bin ich im moment an der gleichen stelle wie ich mit include gewesen wäre.
thx schonmal im voraus
Blackgreetz 19-07-2008, 16:10 Wenn ich dich richtig verstanden habe, suchst du:
ob_start
mfg
ps: geht auch beim include..
UzumakiNaruto 19-07-2008, 16:15 thx .. sieht schonmal super aus.
dann muss ich in der funktion die das return erwartet nur noch ob_end_flush() ausführen?!?!?!
scheint so nicht zu klappen :confused:
class LoadContent
{
#[...]
public function LoadContent($module_name, $file_name = "")
{
#[...]
$template_content = new Template(LoadConfig::getData("theme_dir")."template_content.html");
$template_content->replace("title", $module_name);
$template_content->replace("text", $this->getModule());
echo $template_content->echo_template();
}
private function getModule()
{
return $this->checkModule();
ob_end_flush();
}
private function checkModule()
{
#[...]
}
private function loadModule($path_to_file)
{
$fp = fopen($path_to_file, 'r');
while ($file = fgets($fp))
{
$input .= $file;
}
fclose($fp);
ob_start();
eval($input);
}
}
Blackgreetz 19-07-2008, 16:18 Wenn es so im Manual steht -hust-
UzumakiNaruto 19-07-2008, 16:24 Original geschrieben von Blackgreetz
Wenn es so im Manual steht -hust-
so wie ich das will will php das nicht ... eval schreibt es dennoch sofort
Blackgreetz 19-07-2008, 16:25 dann wäre es eventuell sinnvoll etwas code zu zeigen...
mfg
UzumakiNaruto 19-07-2008, 16:28 Original geschrieben von Blackgreetz
dann wäre es eventuell sinnvoll etwas code zu zeigen...
mfg
richte mal deine augen nach oben .. dort findest du welchen :D
Blackgreetz 19-07-2008, 16:35 Falls sie mit dem Puffer-Inhalt weiter arbeiten möchten, müssen sie diesen erst per ob_get_contents() zwischen speichern bevor sie ob_end_flush() aufrufen, da dadurch der Puffer geleert wird.
Diese Funktion ähnelt ob_get_flush(), liefert aber nur den Erfolgsstatus statt des aktuellen Pufferinhalts zurück.
Dies sagt php.net zu ob_end_flush() ...
Wolltest du das, oder den Inhalt?
Dachte mein -hust- wäre eindeutig, falls ich dich richtig verstanden hatte..
Btw: Warum schreibst du deine Funktion in PHP4/5 statt 5? ..
..Ich weiß allerdings nicht, ob solch eine Output Controll auch bei Klassen funktioniert und hab auch gerade keine Lust, es selber zu testen..
mfg
UzumakiNaruto 19-07-2008, 16:43 ich möchte verhindern das eval vorschnell den inhalt sendet ... sondern eigentlich den rückgabewert von eval als return übergeben .. damit ich das ganze in das template-system bekomme.
also php5 ist installiert .. und so ganz bin ich nicht mit den versionsunterschieden vertraut, den ich denke du erkennst am programmcode die vermeindliche php-version.
auch das ob_get_contents() hatte mir nichts gebracht
ob_start();
eval($input);
funktioniert ja schon nicht ... den wenn ich weder ob_get_contents() und ob_end_flush() benutze, kommt dennoch der inhalt von eval .. und zwar als echo sofort.
onemorenerd 19-07-2008, 16:44 Nach einem return kannst du dir jeglichen weiteren Code sparen. Er wird niemals ausgeführt.
Imho ist es sehr schlechter Stil, in einer Methode das Output Buffering zu starten und in einer anderen zu beenden, auch wenn beide Methoden private sind. Damit erzwingst du, dass beide Methoden immer paarweise und in richtiger Reihenfolge aufgerufen werden. Dieser Zwang drückt sich aber nirgendwo aus, man muss schon den Code kennen. In einem Jahr wirst du ihn selbst nicht mehr im Kopf haben und ich wünsche viel Spaß beim Debugging. ;)
Last but not least ist die Methode loadModule() doch eigentlich nichts anderes als ein require. Wieso baust du das so umständlich nach?
UzumakiNaruto 19-07-2008, 16:48 Original geschrieben von onemorenerd
Nach einem return kannst du dir jeglichen weiteren Code sparen. Er wird niemals ausgeführt.
Imho ist es sehr schlechter Stil, in einer Methode das Output Buffering zu starten und in einer anderen zu beenden, auch wenn beide Methoden private sind. Damit erzwingst du, dass beide Methoden immer paarweise und in richtiger Reihenfolge aufgerufen werden. Dieser Zwang drückt sich aber nirgendwo aus, man muss schon den Code kennen. In einem Jahr wirst du ihn selbst nicht mehr im Kopf haben und ich wünsche viel Spaß beim Debugging. ;)
Last but not least ist die Methode loadModule() doch eigentlich nichts anderes als ein require. Wieso baust du das so umständlich nach?
das ob_start() etc kannte ich bis eben nicht und kenne somit vor und nachteile des ganzen spieles nicht.
include/require erfüllen meine anforderungen ja nicht, da include/require SOFORT ausgeben und nicht zu einem zeitpunkt wenn ich es wünsche und ich somit den inhalt an eine bestimmte stelle im template-system bekomme
ist es denn so schwer?
ob_start();
include_once($file);
$parsed_content = ob_get_contents();
ob_end_clean();
UzumakiNaruto 19-07-2008, 16:58 Original geschrieben von 3DMax
ist es denn so schwer?
ob_start();
include_once($file);
$parsed_content = ob_get_contents();
ob_end_clean();
schwer nicht .. aber anscheinend nicht die lösung meines problemes
jetzt habe ich aber den inhalt der php datei an der richtigen stelle .. aber wenn ich den dann mit eval "ausführen" lasse wird er wieder als eche ausgegeben und ist nicht mehr an der richtigen stelle.
Original geschrieben von UzumakiNaruto
... aber anscheinend nicht die lösung meines problemes
jetzt habe ich aber den inhalt der php datei an der richtigen stelle .. aber wenn ich den dann mit eval "ausführen" lasse wird er wieder als eche ausgegeben und ist nicht mehr an der richtigen stelle.
verstehe ich nicht, mit dem schnipsel erhälst du den php-interpretierten inhalt und eval ist überflüssig.
Blackgreetz 19-07-2008, 17:16 @Uzumaki: include ^= fopen + eval ... wenn du so willst
ps: geht auch beim include..
Hatte ich schon ganz am Anfang gesagt :/
mfg
UzumakiNaruto 19-07-2008, 17:34 das ist mir an sich alles klar .. das problem ist aber .. ich bekomme den inhalt der php datei angezeigt und NICHT das ergebnis.
function a(){echo "asd";}a();
das ist der inhalt der php datei (zum schnellen test) und ich bekomme genau das wieder angezeigt.
private function loadModule($path_to_file)
{
ob_start();
include($path_to_file);
$parsed_content = ob_get_contents();
ob_end_clean();
echo $parsed_content #gleiche ausgabe
return $parsed_content;
}
Original geschrieben von UzumakiNaruto
das ist mir an sich alles klar .. das problem ist aber .. ich bekomme den inhalt der php datei angezeigt und NICHT das ergebnis.
function a(){echo "asd";}a();
äh, php-tags stehen aber schon drum? :rolleyes:
bei nem include wechselt der parser erstmal in den html-modus.
UzumakiNaruto 19-07-2008, 17:42 Original geschrieben von 3DMax
äh, php-tags stehen aber schon drum? :rolleyes:
bei nem include wechselt der parser erstmal in den html-modus.
alter nein .. das kann es nicht sein ... für eval hatte ich diese tags entfernt und deshalb hatte es auch nur mit include + eval funktioniert ... soviel "rauch" um nichts.
@blackgreetz
jetzt würde ich von dir gerne noch wissen wieso du der meinung warst ich würde php4/5 programmieren??? wenn will ich ja auch was lernen :D
Blackgreetz 19-07-2008, 18:05 Guckst du: http://www.php.net/manual/de/language.oop5.decon.php
UzumakiNaruto 19-07-2008, 18:13 alte gewohnheit :D ... meine anderen 5 klassen arbeiten bereichts mit __construct ... auch wenn ich den sinn nicht verstehe ob klassenname als funktion oder __construct als funktion ... oder gibt es dort große änderungen???
Blackgreetz 19-07-2008, 18:23 Original geschrieben von UzumakiNaruto
.. oder gibt es dort große änderungen???
Wieso sollte es, wenn es die gleiche Aufgabe erfüllen soll? O.o
PHP hats einfach in der V5 so eingeführt.
Sollen eben vereinheitlicht werden, obwohls ja in den anderen Sprachen auch mit Name geht...
mfg
|