PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Teile meines PHP-Scriptes auslagern?


mf_2
2006-06-20, 18:03:02
Hallo,
ich habe ein Problem: Eines meiner PHP-Projekte ist jetzt 108kb groß und hat weit über 3000 Zeilen Code. Es ist langsam wirklich eine Qual, das zu editieren.
Hier mal ein grobes Gerüst des Scriptes, es besteht aus vielen if-Abfragen:

if($var01 == 1)
{
// Hier sind viele Zeilen Code
}

if($var01 == 2)
{
// Hier sind viele Zeilen Code
}

if($var01 == 3)
{
// Hier sind noch viel mehr Zeilen Code
}
etc pp

Also, der Aufbau ist sehr simpel.
Nun habe ich folgendes versucht, obwohl ich keine Ahnung hatte ob es funktionieren würde. Und fast wie zu erwarten hat es nicht funktioniert ;) :

if($var01 == 1)
{
// Hier sind viele Zeilen Code
}

include "var02.php";

if($var01 == 3)
{
// Hier sind noch viel mehr Zeilen Code
}
etc pp

Inhalt der var02.php:

if($var01 == 2)
{
// Hier sind viele Zeilen Code
}


Wisst ihr, wie man so etwas so einbindet, dass es funzt? Ich will ned, dass var02.php ausgewertet wird oder per return irgendeinen wert zurückgibt, es soll einfach quasi an den quelltext eingefügt werden, ohne was auszuwerten. geht das? oder ist mein gedankengang so nicht umsetzbar?

darph
2006-06-20, 18:10:28
Also wenn du eh nur var auswertest... warum kein case Statement und dann nur "die vielen Zeilen Code" inkludieren? Innerhalb eines cases. Oder aus den vielen Zeilen Code Methodenaufrufe rausexcludieren und die in externe functions.php auslagern.

tomtom
2006-06-20, 20:26:17
Wie darph schon sagte: am Besten schreibst du wichtige Codefragmente in Form von functions und bindest diese mittels include() ein - so hast du ein bissl mehr Übersicht.

Ich weiß zwar nicht wie dein restlicher Code aussieht, aber Kommentare wirken auch Wunder (ohne dir jetzt unterstellen zu wollen, dass du kein Augenmerk darauf legst ;) )

Bei über 3000 Zeilen Code kann man aber eventuell schon auf die OOP zurückgreifen und das Ganze in Klassen realisieren - kommt aber ganz darauf an, was für eine Anwendung dein Script darstellt ;)

Edit:
Wisst ihr, wie man so etwas so einbindet, dass es funzt? Ich will ned, dass var02.php ausgewertet wird oder per return irgendeinen wert zurückgibt, es soll einfach quasi an den quelltext eingefügt werden, ohne was auszuwerten. geht das? oder ist mein gedankengang so nicht umsetzbar?

Mit der include-Function wird der Inhalt der angegebenen Datei rauskopiert und in die andere eingefügt, danach wird der Code normal abgearbeitet, also nichts wird vorher ausgewertet ;)

MfG

mf_2
2006-06-20, 20:32:10
terminator2k3[/POST]']
Mit der include-Function wird der Inhalt der angegebenen Datei rauskopiert und in die andere eingefügt, danach wird der Code normal abgearbeitet, also nichts wird vorher ausgewertet ;)

MfG

Achso, dann habe ich die dokumentation auf der php.net seite dazu falsch verstanden. naja, dann leigt der fehler vermutlich woanders....

Marcel
2006-06-22, 23:50:21
Wie wär's mit

include("var".$var01.".php");

? Dann sparst Du Dir die ganzen if-Zeilen.
Du baust nur für jeden Inhalt der Variable $var01 eine Datei mit entsprechendem Namen (var1.php, var2.php...), und da haust Du dann den Befehls-Block innerhalb der ifs rein (also wie Du das mit der var02.php schon vorgeschlagen hast, nur ohne "if (...) {" und "}").

Falls Du den else-Zweig noch brauchst, fragste halt ab, ob file_exists("var".$var01.".php") true ist. Im then machste das include, im else den else-Zweig.

Coda
2006-06-23, 00:39:34
Marcel[/POST]']Wie wär's mit

include("var".$var01.".php");

? Dann sparst Du Dir die ganzen if-Zeilen.
Vorsicht, Vorsicht. Das ist eine potentielle Sicherheitslücke.

MadMan2k
2006-06-23, 01:06:34
Coda[/POST]']Vorsicht, Vorsicht. Das ist eine potentielle Sicherheitslücke.
include("var". (int)$var01 .".php");

Michbert
2006-06-23, 07:45:42
mf_2[/POST]']Achso, dann habe ich die dokumentation auf der php.net seite dazu falsch verstanden. naja, dann leigt der fehler vermutlich woanders....Was noch zu beachten ist: Wenn du Dateien per include oder require einbindest, werden diese erstmal nur als reiner Text interpretiert, das heißt falls du php-code drin hast musst du erst wieder die PHP-Tags verwenden.

Tommes
2006-06-23, 15:54:28
MadMan2k[/POST]']include("var". (int)$var01 .".php"); Ist das PHP5? Ich kenne das sonst nur so:

include("var". intval($var01) .".php");

Mit dem int() vor der Variable kenne ich es aus JAVA.

Marscel
2006-06-23, 16:06:22
Beides möglich, unter PHP sollte es auch ziemlich egal sein, welche Methode man nimmt.

Marcel
2006-06-25, 23:08:48
Coda[/POST]']Vorsicht, Vorsicht. Das ist eine potentielle Sicherheitslücke. include("var".$var01.".php");

Sicherheitslücke: Falls jemand $var01 von Hand setzt, auf ein anderes Skript in einem anderen Verzeichnis? Dann müsste man dies doch umgehen können, indem man sicherstellt, dass $var01 nichts von folgendem enthält:
- / am Anfang
- // irgendwo mittendrin (?)
- /../ irgendwo mittendrin
- ../ am Anfang
oder?

Marscel
2006-06-25, 23:42:19
Marcel[/POST]']include("var".$var01.".php");

Sicherheitslücke: Falls jemand $var01 von Hand setzt, auf ein anderes Skript in einem anderen Verzeichnis? Dann müsste man dies doch umgehen können, indem man sicherstellt, dass $var01 nichts von folgendem enthält:
- / am Anfang
- // irgendwo mittendrin (?)
- /../ irgendwo mittendrin
- ../ am Anfang
oder?

Ein weiterer Mar(s)cel. :D

Durch "var" am Anfang und ".php" als Dateendung ist das Risiko schon geringer, aber nicht zu unterschätzen, wenn $var01 durch unglückliche Umstände nicht gesetzt ist und register_globals aktiviert ist, kann man als URL-Parameter z.B. einen anderen Wert dieser Variablen zuweisen, was dann eine andere Datei sein wird und das wird nicht beabsichtigt sein.

Prinzipiell gilt deshalb:
- Alles was nicht in die GLOBALS gehört, entfernen.
- Datein immer mittels basename() aufrufen, wenn der Name nicht statisch ist (entfernt relative Pfadangaben).
- Dateien auf die Existenz überprüfen.
- Am besten mit einem switch() oder if-elseif arbeiten, damit ja nichts ungewolltes zu erreichen ist.

Coda
2006-06-26, 13:11:06
MadMan2k[/POST]']include("var". (int)$var01 .".php");
Ja so ist es besser.