leos vorlage zu der alten plf
🧩 ProbePLF — PHP OOP (Sessions, Vererbung, Namespaces)
🎯 Ziel
Aufbau einer kleinen PHP-Webapp mit Formular und Session-Speicherung, die OOP-Grundlagen (Klasse, Kapselung, Getter/Setter), Vererbung und Namespaces einsetzt.
🧱 Issue 1 — Wesentlich_überwiegend
Aufgabe (Issue 1)
Entwickle eine erste Version als Einzeldatei (index.php) mit Session, Formular und einer Klasse.
Session aktivieren: session_start() muss als allererster PHP-Befehl in index.php stehen.
Formular (Methode POST) mit genau 4 Eingabefeldern in sinnvollem Kontext (z. B. Produkt, Reise, Tier):
4 unterschiedliche HTML-type (z. B. text, number, date, email o. Ä.)
Sinnvolle Vorgabewerte per value="..."
Klasse Item mit
4 privaten Membervariablen mit unterschiedlichen Datentypen,
vollständigen Gettern/Settern,
Konstruktor, der ausschließlich die Setter verwendet.
Nach POST: Neues Item-Objekt erzeugen und in ein assoziatives Array in der Session speichern:
Key: z. B. inkrementelle ID oder uniqid()
Mehrere Objekte müssen speicherbar sein.
Ausgabe: Das Session-Array als HTML-Tabelle anzeigen (1 Spalte pro Membervariable + Key).
Buttons/Aktionen:
Speichern (Formular abschicken)
Löschen eines Eintrags über einen eingegebenen Key
Alle löschen (Session-Array leeren)
✅ Akzeptanzkriterien (Issue 1)
session_start() steht ganz oben und Daten bleiben zwischen Requests erhalten.
4 Formularfelder mit unterschiedlichen type und sinnvollen value-Defaults sind vorhanden.
Item kapselt Daten: private Variablen, vollständige Getter/Setter, Konstruktor nutzt Setter.
Speicherung in $_SESSION als assoziatives Array; mehrere Einträge sind möglich.
Tabelle zeigt alle gespeicherten Objekte inkl. Key korrekt an.
Buttons: Speichern, Löschen nach Key, Alles löschen funktionieren sichtbar.
🧱 Issue 2 — Wesentlich_vollständig
Aufgabe (Issue 2)
Erweitere auf Vererbung und erweitere das Datenmodell um zusätzliche Felder.
Item-Membervariablen auf protected ändern.
Neue Klasse ItemPlus erstellt, die von Item erbt.
3 zusätzliche private Membervariablen (unterschiedliche Datentypen) inkl. Getter/Setter.
Konstruktor ruft parent::__construct(...) auf und verwendet auch hier Setter.
Formular um diese 3 Felder erweitern (inkl. Default-value).
Speicherung in der Session nur als Instanzen von ItemPlus (nicht mehr Item).
Einfache Eingabevalidierung pro Feld beim Speichern:
Leerwertprüfung, Datentyp-Prüfung (so weit über HTML-type hinaus nötig), einfache Range-Prüfung wo sinnvoll.
Alle Fehler einer Eingabe werden gesammelt und gemeinsam angezeigt (kein Abbruch nach dem ersten Fehler).
✅ Akzeptanzkriterien (Issue 2)
Item → protected für geerbte Member; ItemPlus erweitert um 3 private Variablen mit Getter/Setter.
Konstruktor von ItemPlus nutzt parent::__construct und Setter-Kaskade.
Formular besitzt 7 sinnvolle Felder mit Defaults; Tabelle zeigt alle 7 Werte pro Eintrag.
Validierungen laufen durch und zeigen alle betroffenen Fehler verständlich an; bei Fehlern wird nicht gespeichert.
🧱 Issue 3 — PlusPlus Aufgabe (Fortgeschritten)
Aufgabe (Issue 3)
Struktur und Lesbarkeit verbessern: Auslagerung der Klassen in Dateien und Verwendung von Namespaces.
Lege Verzeichnisstruktur an (Beispiel):
src/Model/Item.php
src/Model/ItemPlus.php
Jede Klasse in eine eigene Datei; Dateiname = Klassenname.
Beide Klassen im Namespace App\Model deklarieren.
In index.php die Klassendateien via require_once einbinden und mit use App\Model\ItemPlus; arbeiten.
Funktionalität gegenüber Issue 2 bleibt unverändert.
✅ Akzeptanzkriterien (Issue 3)
Klassen liegen in separaten Dateien unter src/Model und sind mit namespace App\Model; versehen.
index.php bindet strikt per require_once ein und verwendet use-Importe.
Anwendung läuft weiter fehlerfrei; Verhalten entspricht Issue 2.
🧱 Optionale Extra-Challenge (nur wenn Zeit übrig ist)
Füge eine kleine statische Validator-Klasse (z. B. App\Util\Validator) hinzu und rufe deren Methoden in der Formularlogik auf.
Oder: Richte Composer-PSR-4-Autoloading für App\ ein (anstelle von require_once).
🧪 Hinweise (nicht verpflichtend, nur Starthilfe)
Session kurz:
Key erzeugen: $_POST['id'] ?? uniqid() oder eigener Zähler in der Session.
Tabelle: Keys sichtbar machen, damit gezieltes Löschen möglich ist.