Genealogie: Architektur
Das Design einer PHP-Webanwendung beeinflusst deren Qualität entscheidend. PHP hatte in dieser Hinsicht lange einen schlechten Ruf durch die Verquickung von HTML- und PHP-Code. Gutes Design ermöglicht die Trennung der beiden und fördert dadurch die Aufgabenteilung zwischen Designer und Programmierer. Darüber hinaus sorgt es für eine Strukturierung des PHP-Codes, die zu einer besseren Wartbarkeit und höheren Robustheit der Anwendung beiträgt.

Aus diesen Gründen wurde für Genealogie ein 4-Schichten-Modell, bestehend aus:
  • Darstellungsschicht
  • Applikationsschicht
  • Datenstruktur und
  • Datenbankschicht
gewählt:
Layers

Darstellungsschicht:

Für die Bereitstellung der Benutzeroberfläche ist die Darstellungsschicht zuständig. Sie besteht aus statischen HTML-Seiten (mit isolierten PHP-Einschüben) sowie eine Hilfsklasse zur Generierung komplexer HTML-Tags (HTMLGenerator.inc.php).

Da sich darzustellende Element ausschließlich in dieser Schicht finden, sind bei Layoutänderungen lediglich Anpassungen in dieser Schicht notwendig. Durch die Trennung von HTML und PHP sind diese recht übersichtlich und beschränken sich auf änderungen in HTML.


Applikationsschicht:

Die Applikationsschicht besteht aus ausführbaren PHP-Skripten, in denen die Ablauflogik der Applikation realisiert ist.


Datenstruktur:

Die Datenstruktur (-schicht) enthält Klassen, in denen die Datenstrukturen und deren Logik hinterlegt sind. Deren Instanzen repräsentieren im Programm die Daten-Entitäten. Häufig ist nur eine einzige, jedoch unter Umständen mehrfach instanziierte Datenklasse erforderlich.

Die Datenklassen dienen als so genannter "Information Expert", das heißt, sie verwaltet alle fachlich relevanten Informationen und stellen geeignete Zugriffsmethoden bereit. Sie enthält jedoch keine Informationen oder Methoden zum Lesen der Daten aus der Datenbank oder zum persistenten Speichern. Dies ist Sache der Klassen der Datenbankschicht. Dass die Klassen keine Methoden zum Datenbankzugriff enthalten, hängt mit dem verwendeten Konzept für den Zugriff zusammen, der über einen so genannten Datenbank-Mapper realisiert ist.

Zunächst haben Datenklasse für jede relevante Eigenschaft ein Attribut. Typischerweise entsprechen diese weit gehend den Eingabefeldern des HTML-Formulars der dazugehörigen Pflegetransaktion. Die Attribute können einzelne Variablen oder komplexe Datenstrukturen wie Felder oder wieder Objekte sein. Alle Attribute sind gemäß dem Prinzip des Information Hiding privat, sodass der Zugriff nur über entsprechende Zugriffsmethoden erlaubt ist. Der Konstruktor (__construct()) dient dazu, die Attribute auf Grund der als Parameter übergebenen Werte zu initialisieren. Ein überladen mehrerer Konstruktoren (oder Methoden) wie in C++ ist wegen der Typlosigkeit von PHP leider nicht realisierbar, jedoch kann sich hier weit gehend über die Verwendung von Default-Werten oder die Typprüfung innerhalb des Konstruktors beholfen werden.

Sinnvoll ist in der Regel die Bereitstellung geeigneter Methoden zur Gültigkeitsprüfung der im Konstruktor oder über die set-Methoden gesetzten einzelnen Attribute sein.


Datenbankschicht:

Schnittstellen-Klassen zur Kapselung der Datenbankzugriffe.

Die Datenbankzugriffsklassen sind für das Mapping zwischen den Fachobjekten und den zugrunde liegenden Datenbankeinträgen zuständig. Sie sollen die Datenbankzugriffe kapseln und eine einfache Schnittstelle bereitstellen. Nur hier existieren SQL-Statements! Ziel ist die Kapselung der technischen Aspekte der Datenbankzugriffe, das heißt die nach außen hin bereitgestellten Methoden sollen unabhängig vom verwendeten Datenbanksystem sein.


Session-Management:

Daneben erstreckt sich schichtübergreifend die Klasse für das Session-Management. Diese enthält alle notwendigen Daten einer aktiven Session, wie z.B. Login-Parameter. Aktive Variablen, die über mehrere HTML-Forms bnötigt werden sind hier ebenso integriert wie z.B. die Ablaufsteuerng der Menus.


üblicherweise lässt eine solche Architektur nur Zugriffe innerhalb einer Schicht oder von einer in die direkt darunterliegende zu, um die Abhängigkeiten zwischen den Schichten zu minimieren. Jede Klasse ist im Allgemeinen genau einer Schicht zugeordnet. Um die Verwendung des Schichtenmodells zu vereinfachen, wird hier jedoch an einigen Stellen davon abgewichen. Es wird also eine offene Architektur (relaxed architecture), die den Zugriff aus einer Schicht auf alle darunterliegenden zulässt, verwendet. Insbesondere greift die Darstellungsschicht direkt auf die Datenstrukur (-schicht) zu. Dies führt zu einer erheblichen Vereinfachung der Ablauflogik.


Abbildung des Schichtenmodells auf dem Filesystem:

Die Files der Darstellungsschicht tragen natürlich die Endung *.php und befinden sich direkt im Arbeitsverzeichnis Genealogie. Die Files der anderen Schichten enden auf *.inc.php und sind in seperaten Unterverzeichnissen abgelegt:

 Darstellungsschicht   Genealogie 
 Applikationsschicht   Genealogie\Application 
 Datenstruktur   Genealogie\Structure 
 Datenbankschicht   Genealogie\DB 
.:  :.