E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 88 von 91.
Aufgabe
EinfachWir erstellen eine E-Learning Platform, die Kurse, Studierende und Dozenten verwaltet. Diese umfassende Herausforderung vereint Vererbung, Schnittstellen, Kapselung und Entwurfsmuster zu einem kohärenten System.
Du organisierst deinen Code über sechs Dateien:
User.php: Erstelle eine abstrakteUser-Klasse, die als Basis für Studierende und Dozenten dient. Verwende Konstruktor-Promotion fürid(int) undname(string), beide als public readonly. Füge eine abstrakte MethodegetRole(): stringhinzu, die von den Kindklassen implementiert werden muss.Student.php: Binde die User-Datei ein. Erstelle eineStudent-Klasse, dieUsererweitert. Studierende speichern ihre belegten Kurse in einem privaten Array sowie ihren Fortschritt (abgeschlossener Prozentsatz) für jeden Kurs. Implementiere:getRole(): string: gibt"Student"zurückenrollInCourse(Course $course): string: schreibt den Studierenden ein, wenn der Kurs noch Kapazität hat; gibt eine Erfolgs- oder Fehlermeldung zurückgetEnrolledCourses(): array: gibt das Array der belegten Kurse zurückupdateProgress(string $courseTitle, int $percent): void: setzt den Fortschritt für einen Kurs (0-100)getProgress(string $courseTitle): int: gibt den Fortschrittsprozentsatz zurück oder 0, wenn der Kurs nicht belegt ist
Instructor.php: Binde die User-Datei ein. Erstelle eineInstructor-Klasse, dieUsererweitert. Dozenten können Kurse erstellen und verwalten. Implementiere:getRole(): string: gibt"Instructor"zurückcreateCourse(string $title, int $capacity): Course: erstellt einen neuen Kurs mit diesem Dozenten als zugewiesenem Dozenten und gibt ihn zurück
Course.php: Binde die Instructor-Datei ein. Erstelle eineCourse-Klasse mit Konstruktor-Promotion fürtitle(string, public readonly),instructor(Instructor, public readonly) undcapacity(int, private). Speichere eingeschriebene Studierende in einem privaten Array. Implementiere:getCapacity(): int: gibt die maximale Kapazität zurückgetEnrolledCount(): int: gibt die aktuelle Anzahl der Einschreibungen zurückhasCapacity(): bool: gibt true zurück, wenn sich noch weitere Studierende einschreiben könnenaddStudent(Student $student): bool: fügt den Studierenden hinzu, wenn die Kapazität dies zulässt, und gibt den Erfolgsstatus zurückgetStudents(): array: gibt das Array der eingeschriebenen Studierenden zurück
Platform.php: Binde die Course- und Student-Dateien ein. Erstelle einePlatform-Klasse, die das gesamte System verwaltet. Speichere Kurse und Benutzer in privaten Arrays. Implementiere:addCourse(Course $course): void: fügt der Plattform einen Kurs hinzufindCourse(string $title): ?Course: findet einen Kurs anhand seines TitelsenrollStudent(Student $student, string $courseTitle): string: schreibt einen Studierenden in einen Kurs ein. Gib"Course not found","Course is full"oder"[name] enrolled in [title]"zurückgetCourseStats(string $title): string: gibt"[title]: [enrolled]/[capacity] students"oder"Course not found"zurück
main.php: Binde die Platform-Datei ein. Du erhältst drei Eingaben: Dozentendaten (JSON), zu erstellende Kurse (JSON) und auszuführende Vorgänge (JSON).Format des Dozenten-JSON:
{"id": 1, "name": "Dr. Smith"}Format des Kurs-JSON:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]Format des Vorgangs-JSON:
[{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]Erstelle die Plattform, den Dozenten und alle Kurse (unter Verwendung der Methode
createCoursedes Dozenten). Füge die Kurse der Plattform hinzu. Verarbeite anschließend jeden Vorgang:"enroll": Erstelle einen neuen Studierenden und schreibe ihn ein; gib das Ergebnis vonenrollStudent()aus"progress": Aktualisiere den Fortschritt des Studierenden; gib"[name] progress in [course]: [percent]%"aus"stats": Gib das Ergebnis vongetCourseStats()aus
Behalte die erstellten Studierenden anhand ihrer ID im Blick, damit du ihren Fortschritt später aktualisieren kannst. Gib das Ergebnis jedes Vorgangs in einer neuen Zeile aus.
Diese Herausforderung zeigt, wie Vererbung eine klare Benutzerhierarchie schafft, Kapselung die Einschreibedaten schützt und die Plattform als Koordinator die Beziehungen zwischen Kursen, Studierenden und Dozenten verwaltet.
Probier es selbst
<?php
require_once 'Platform.php';
// Eingaben lesen
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);
// TODO: Erstelle die Plattform
// TODO: Erstelle den Instructor aus instructorData
// TODO: Erstelle alle Kurse mit der createCourse-Methode des Instructors
// und füge sie der Plattform hinzu
// TODO: Behalte erstellte Studenten anhand ihrer ID im Blick
$students = [];
// TODO: Verarbeite jede Operation
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: Behandle die "enroll"-Operation
// Erstelle einen neuen Student und schreibe ihn ein
// Gib das Ergebnis von enrollStudent() aus
// TODO: Behandle die "progress"-Operation
// Aktualisiere den Fortschritt des Studenten
// Gib "[name] progress in [course]: [percent]%" aus
// TODO: Behandle die "stats"-Operation
// Gib das Ergebnis von getCourseStats() aus
}
?>Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler