Das EVA-Prinzip (Eingabe/Verarbeitung/Ausgabe)

Definition von EVA

Das EVA-Prinzip ist eines der wichtigsten Prinzipien der Softwareentwicklung und sollte bei jedem Programmierer bekannt sein. Ausgeschrieben heißt EVA „Eingabe Verarbeitung Ausgabe“ und beschreibt den Ablauf eines Programms. Laut dem EVA-Prinzip sollen zuerst Daten eingegeben, dann verarbeitet und am Ende ausgegeben werden.

EVA bei PHP

EVA ist nicht nur in PHP sehr wichtig, sondern auch in den meisten (allen? ich leg mich da lieber nicht fest) anderen Sprachen. In diesem Artikel zeige ich die Anwendung des EVA-Prinzips anhand PHP auf.

Die Eingabe

Bei PHP müssen wir uns um die Eingabe eigentlich nicht kümmern, da diese über das HTTP (Hypertext Transfer Protocol) stattfindet. Sämtliche Eingaben stehen uns dann in den superglobalen Arrays von PHP zur Verfügung:

  • $_GET
  • $_POST
  • $_REQUEST
  • $_COOKIE
  • $_SERVER
  • $_FILES

Der erste Schritt des EVA-Prinzips kann uns also relativ egal sein, da wir uns nicht darum kümmern müssen.

Die Verarbeitung

Hier fängt dann unser Aufgabenbereich an. Wir müssen die Daten, die eingegeben werden so bearbeiten, dass sie nachher ausgegeben werden können. Um es möglichst einfach zu halten, realisieren wir hier einen kleinen Rechner, der 2 Zahlen addiert, die er per GET ($_GET[„zahl1“] und $_GET[„zahl2“]) erhält.

//Eingabevariablen zuweisen und sicherstellen, dass nur Zahlen weiterverwendet werden
//Kleine Erklärung zu den folgenden 2 Zeilen:
//Hier wird der "Trinitätsoperator" verwendet, der ein einfaches if ersetzt. Sind die Zahlen gesetzt, werden sie den Variablen zugewiesen,
//ansonsten wird den Variablen 0 zugewiesen.
//Auf diese Weise erreichen wir, dass die Anwendung auf jeden Fall funktioniert, auch wenn keine Parameter übergeben werden.
//Die restliche Anwendung muss nichtmehr prüfen, ob etwas übergeben wurde, da das gleich am Anfang passiert.
$z1 = (isset($_GET["zahl1"])) ? (int)$_GET["zahl1"] : 0;
$z2 = (isset($_GET["zahl2"])) ? (int)$_GET["zahl2"] : 0;

//Verarbeitung der Eingabe
$ergebnis = $z1+$z2;

Die Ausgabe

Da wir das Erebnis jetzt in $ergebnis gespeichert haben, können wir das Ergebnis sehr einfach ausgeben:

//Ausgabe
echo "Das Ergebnis von ".$z1." + ".$z2." lautet ".$ergebnis;

Ich gehe hier davon aus, dass das Skript unter http://localhost/ aufgerufen werden kann. In meinem Fall liegt es in C:\\xampp\htdocs und hat den Namen index.php.

Wenn man das Skript jetzt aufruft, bekommt man folgende Ausgabe

Das Ergebnis von 0 + 0 lautet 0

Man kann jetzt im Browser http://localhost/?zahl1=4 aufrufen und erhält des Erebnis 4. Gibt man noch den Parameter zahl2 an, werden die Zahlen addiert:  http://localhost/?zahl1=4&zahl2=9 ergibt die Ausgabe

Das Ergebnis von 4 + 9 lautet 13

Wie wäre es falsch?

In diesem Beispiel wäre es auch denkbar, das Skript so zu schreiben:

//Eingabevariablen zuweisen und sicherstellen, dass nur Zahlen weiterverwendet werden
$z1 = (isset($_GET["zahl1"])) ? (int)$_GET["zahl1"] : 0;
$z2 = (isset($_GET["zahl2"])) ? (int)$_GET["zahl2"] : 0;

echo "Zahl 1: ".$z1."\n";
echo "Zahl 2: ".$z2."\n";
//Verarbeitung der Eingabe
$ergebnis = $z1+$z2;
echo "Ergebnis:".$ergebnis;

Das Skript ist zwar genauso funktionsfähig, vermischt aber die Verarbeitung und die Ausgabe. Bei einfachen Aufgaben ist das noch kein Problem. Bei größeren Aufgaben wird das aber schnell unübersichtlich und kompliziert.

Ein häufiges Anwendungsgebiet: Dynamischer Content

Ein Fall, der sehr oft zu finden ist, ist der sogenannte dynamische Content. Darunter versteht man ein festes Layout einer Seite mit dynamischem Content.

Jeder aufmerksame Internetnutzer hat bestimmt schon auf diversen Seiten sowas gesehen: index.php?site=home oder index.php?site=impressum

Der Gedanke dahinter ist ziemlich einfach. In 99% aller Anwendungsfällen haben alle Unterseiten einer Website das selbe Layout. Das einzige, was sich ändert, ist der Inhalt (=> dynamischer Content). Das Layout steht in der index.php und je nach übergebenem Parameter (?site=) wird ein anderer Inhalt angezeigt. Das ist auch schon die ganze Idee. Die Umsetzung ist auch nicht viel schwieriger.

Einfaches Beispiel für die Implementierung von dynamischem Content

Als erstes brauchen wir unser Grundlayout in der index.php. Das sieht in diesem Beispiel so aus:

<!-- Hier kommt eigentlich der Doctype hin, aber wir brauchen in diesem Beispiel keinen! -->
<html>
 <head>
  <title>Seitentitel</title>
 </head>
 <body>
  <div>Menu</div>;
  <div>Content</div>;
 </body>
</html>

Diese Datei wird unter index.php gespeichert.

Das einzige, was sich später ändern muss, ist der Inhalt (Content). Das erreichen wir, indem wir für jede einzelne Seite eine Datei in einem Unterordner namens pages anlegen. Da wir uns an das EVA-Prinzip halten wollen, inkludieren wir die Dateien nicht (wie man vllt. denken könnte) im Div, sondern ganz oben vor jeglichen Ausgaben. Um zu vermeiden, dass der Content dann schon direkt ausgegeben wird, gibt es 2 Möglichkeiten:

  • Man erstellt für jede Seite noch Template-Dateien, die dann einfach Variablen ausgeben, die im Skript definiert wurden.
  • Man puffert die Ausgabe der inkludierten Datei mit den ob-Funktionen ob_start() und ob_get_clean().

Hier erkläre ich die 2. Möglichkeit, da die etwas sauberer ist als die 1. Wer aber wirklich professionell an das Problem herangehen möchte, macht das mit MVC.

Die index.php muss jetzt um folgendes erweitert werden:

  • Auslesen des site-Parameters
  • Überprüfen dieses Parameters auf Gültigkeit
  • Überprüfen, ob die Datei mit dem Content verfügbar ist
  • Den Output-Buffer starten
  • Die Dateie einbinden (include)
  • Den Output-Buffer beenden und Output in Variable speichern
<?php
//Fehlerausgabe einschalten
error_reporting(E_ALL|E_STRICT);
ini_set('DISPLAY_ERROR',TRUE);

//Wichtig! Es darf nichts vor diesem PHP-Teil ausgegeben werden!

//Alle verfügbaren Seiten werden hier eingetragen
$whitelist = array("impressum", "bla");

if(isset($_GET["site"]))
{ //Wenn eine Seite angegeben wurde, wird sie $site zugewiesen
 $site = $_GET["site"];
}
else
{
 $site = "start";
}

//Prüfen, ob die Datei sich (nicht) in der Whitelist befindet
if(!in_array($site, $whitelist))
{
 //Nein, also Startseite anzeigen! Man könnte hier auch eine Fehlerseite eintragen.
 $site = "start";
}

//Zusammensetzen des Dateinamens
$filename = "pages/".$site.".php";

//Prüfen, ob die erforderliche Datei existiert
if(file_exists($filename))
{
 //Datei existiert und kann benutzt werden!
 //Output-Buffer starten
 ob_start();

 //Datei einbinden
 include($filename);

 //Output-Buffer beenden und Ergebnis speichern
 $content = ob_get_clean();
}
else
{
 $content = "Leider kann diese Seite nicht angezeigt werden!";
}
?>

Diser Codeschnipsel muss in der index.php ganz oben stehen!

Um die Sicherheit der Seite zu erhöhen, gibt es eine Whitelist, die alle Seitennamen enthält, die erlaubt sind.  Hier ist das „impressum“ und „bla“.

Nachdem das Skript durchlaufen wurde, steht in $content der Inhalt der Seite, der ausgegeben werden soll. Damit das auch passiert, muss noch

<div>Content</div>

durch

<div><?php echo $content; ?></div>

ersetzt werden. Ruft man das Beispiel jetzt auf, wird man vermutlich immer den gleichen Fehler zu sehen bekommen:

Leider kann diese Seite nicht angezeigt werden!
Das ist so, weil die Seiteninhalte noch fehlen. Diese müssen in einem Unterordner namens pages abgelegt werden.
Legt einfach mal 2 Dateien an (start.php und bla.php) und schreibt irgend einen Text hinein. Wenn ihr jetzt index.php?site=start oder index.php=site=bla aufruft, funktioniert das!
Ruft ihr dagegen index.php?site=impressum auf, geht das nicht, weil die Datei nicht vorhanden ist.

Wenn ihr noch Lust habt, könnt ihr

<div>Menu</div>

noch durch

<div><a href="index.php?site=start">Start</a> | <a href="index.php?site=bla">Bla</a> | <a href="index.php?site=impressum">Impressum</a></div>

ersetzen. Die ersten 2 Links funktionieren jetzt, der letzte verursacht einen Fehler.

Eine Demo dieses Skripts gibt es hier: http://test.net-developers.de/eva/

Weitere Informationen

Auch das MVC-Prinzip verfolgt das EVA-Prinzip. Dort wird aber noch weiter abstrahiert.

1 Star2 Stars3 Stars4 Stars5 Stars (3 Stimme, durchschnittlich 5,00 / 5)
Loading...


12 Kommentare zu “Das EVA-Prinzip (Eingabe/Verarbeitung/Ausgabe)”

  1. […] Das EVA-Prinzip (Eingabe/Verarbeitung/Ausgabe) […]

  2. […] […]

  3. […] dann etwa “Daten Anzeige Steuerung”. Das MVC-Prinzip oder MVC-Pattern ist wie auch das EVA-Prinzip ein Pattern, das sehr häufig angewandt wird, weil es die Wiederverwendbarkeit des Codes erheblich […]

  4. […] Um herraus zu finden, wie viele Ergebnisse es gibt, kannst du folgendes verwenden. mysql_num_rows Oder du verwendest count() Grundsätzlich sollte ganz oben in jedem skript was man progt folgendes stehen. PHP-Code: error_reporting(E_ALL|E_STRICT); ini_set('DISPLAY_ERROR',TRUE);  Genau so sollte man mysql_error() verwenden. Zum schluss macht es Sinn sich an das Eva Prinzip zu halten. EVA Prinzip […]

  5. […] Wenn du mal logisch drüber nachdenkst, wirst du wohl fesstellen, dass es nicht funktionieren kann, wenn man erst ausliest und danach das update macht. Bitte beachte mal das EVA-Prinzip […]

  6. […] erstes würde ich dir Raten das EVA-Prinzip zu […]

  7. […] würde dir Raten folgende dinge mal an zu schauen: mysql_real_ecape_string() EVA-Prinzip Weterhin möchte ich dich nur mal drauf aufmerksam machen, dass viele User über einen Proxy kommen […]

  8. Danke dir für den guten, sachlichen und klaren Artikel. Für mich als Programmier-Laie wird das EVA-Prinzip als roter Leitfaden dienen 😉
    .-= Oliver´s last blog ..Snoog bringt neuen 7,7-Cent-Tarif auf den Markt =-.

  9. Freut mich, wenn ich dir weiterhelfen konnte 🙂

  10. Sehr schön erklärt, danke du Hurensohn.

  11. johanns

  12. Tekin, was ist denn bei dir los? Spar dir solche Kommentare bitte, danke!

Hinterlasse einen Kommentar!

Time limit is exhausted. Please reload the CAPTCHA.

»Informationen zum Artikel

Autor: Simon
Datum: 22.05.2009
Zeit: 12:57 Uhr
Kategorien: Wissenswertes
Gelesen: 47936x heute: 3x

Kommentare: RSS 2.0.
Diesen Artikel kommentieren oder einen Trackback senden.

»Meta