E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 88 von 91.
Aufgabe
EinfachLassen Sie uns eine E-Learning-Plattform bauen, die Kurse, Studenten und Instruktoren verwaltet. Diese umfassende Herausforderung vereint Vererbung, Interfaces, Kapselung und Design-Patterns in einem zusammenhängenden System.
Sie werden Ihren Code über sechs Dateien organisieren:
User.php— Erstellen Sie eine abstrakte KlasseUser, die als Basis für Studenten und Instruktoren dient. Verwenden Sie Constructor Promotion fürid(int) undname(string), beide public readonly. Fügen Sie eine abstrakte MethodegetRole(): stringhinzu, die Kindklassen implementieren müssen.Student.php— Binden Sie die User-Datei ein. Erstellen Sie eine KlasseStudent, dieUsererweitert. Studenten verfolgen ihre eingeschriebenen Kurse in einem privaten Array und ihren Fortschritt (Prozentsatz der Fertigstellung) für jeden Kurs. Implementieren Sie:getRole(): string— gibt"Student"zurückenrollInCourse(Course $course): string— schreibt den Studenten ein, wenn der Kurs Kapazität hat; gibt eine Erfolgs- oder Fehlermeldung zurückgetEnrolledCourses(): array— gibt das Array der eingeschriebenen 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 nicht eingeschrieben
Instructor.php— Binden Sie die User-Datei ein. Erstellen Sie eine KlasseInstructor, dieUsererweitert. Instruktoren können Kurse erstellen und verwalten. Implementieren Sie:getRole(): string— gibt"Instructor"zurückcreateCourse(string $title, int $capacity): Course— erstellt und gibt einen neuen Kurs zurück, dem dieser Instruktor zugewiesen ist
Course.php— Binden Sie die Instructor-Datei ein. Erstellen Sie eine KlasseCoursemit Constructor Promotion fürtitle(string, public readonly),instructor(Instructor, public readonly) undcapacity(int, private). Verfolgen Sie eingeschriebene Studenten in einem privaten Array. Implementieren Sie: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 weitere Studenten einschreiben könnenaddStudent(Student $student): bool— fügt einen Studenten hinzu, wenn die Kapazität es erlaubt, und gibt den Erfolgsstatus zurückgetStudents(): array— gibt das Array der eingeschriebenen Studenten zurück
Platform.php— Binden Sie die Course- und Student-Dateien ein. Erstellen Sie eine KlassePlatform, die das gesamte System verwaltet. Speichern Sie Kurse und Benutzer in privaten Arrays. Implementieren Sie:addCourse(Course $course): void— fügt der Plattform einen Kurs hinzufindCourse(string $title): ?Course— findet einen Kurs anhand des TitelsenrollStudent(Student $student, string $courseTitle): string— schreibt einen Studenten in einen Kurs ein. Geben Sie"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— Binden Sie die Platform-Datei ein. Sie erhalten drei Eingaben: Instruktordaten (JSON), zu erstellende Kurse (JSON) und auszuführende Operationen (JSON).Format des Instruktor-JSON:
{"id": 1, "name": "Dr. Smith"}Format des Kurs-JSON:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]Format des Operations-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"}]Erstellen Sie die Plattform, den Instruktor und alle Kurse (unter Verwendung der Methode
createCoursedes Instruktors). Fügen Sie die Kurse der Plattform hinzu. Verarbeiten Sie dann jede Operation:"enroll"— Erstellen Sie einen neuen Studenten und schreiben Sie ihn ein; geben Sie das Ergebnis vonenrollStudent()aus"progress"— Aktualisieren Sie den Fortschritt des Studenten; geben Sie"[name] progress in [course]: [percent]%"aus"stats"— Geben Sie das Ergebnis vongetCourseStats()aus
Behalten Sie den Überblick über die erstellten Studenten anhand ihrer ID, damit Sie ihren Fortschritt später aktualisieren können. Geben Sie das Ergebnis jeder Operation in einer neuen Zeile aus.
Diese Herausforderung zeigt, wie Vererbung eine saubere Benutzerhierarchie schafft, Kapselung Einschreibungsdaten schützt und die Plattform als Koordinator fungiert, der die Beziehungen zwischen Kursen, Studenten und Instruktoren 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 Kursleiter aus instructorData
// TODO: Erstelle alle Kurse mit der createCourse-Methode des Kursleiters
// und füge sie der Plattform hinzu
// TODO: Behalte den Überblick über erstellte Studenten anhand ihrer ID
$students = [];
// TODO: Verarbeite jede Operation
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: Behandle die "enroll"-Operation
// Erstelle einen neuen Studenten 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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung