Menu
Coddy logo textTech

E-Learning-Plattform

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 88 von 91.

challenge icon

Aufgabe

Einfach

Wir 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 abstrakte User-Klasse, die als Basis für Studierende und Dozenten dient. Verwende Konstruktor-Promotion für id (int) und name (string), beide als public readonly. Füge eine abstrakte Methode getRole(): string hinzu, die von den Kindklassen implementiert werden muss.
  • Student.php: Binde die User-Datei ein. Erstelle eine Student-Klasse, die User erweitert. Studierende speichern ihre belegten Kurse in einem privaten Array sowie ihren Fortschritt (abgeschlossener Prozentsatz) für jeden Kurs. Implementiere:
    • getRole(): string: gibt "Student" zurück
    • enrollInCourse(Course $course): string: schreibt den Studierenden ein, wenn der Kurs noch Kapazität hat; gibt eine Erfolgs- oder Fehlermeldung zurück
    • getEnrolledCourses(): array: gibt das Array der belegten Kurse zurück
    • updateProgress(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 eine Instructor-Klasse, die User erweitert. Dozenten können Kurse erstellen und verwalten. Implementiere:
    • getRole(): string: gibt "Instructor" zurück
    • createCourse(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 eine Course-Klasse mit Konstruktor-Promotion für title (string, public readonly), instructor (Instructor, public readonly) und capacity (int, private). Speichere eingeschriebene Studierende in einem privaten Array. Implementiere:
    • getCapacity(): int: gibt die maximale Kapazität zurück
    • getEnrolledCount(): int: gibt die aktuelle Anzahl der Einschreibungen zurück
    • hasCapacity(): bool: gibt true zurück, wenn sich noch weitere Studierende einschreiben können
    • addStudent(Student $student): bool: fügt den Studierenden hinzu, wenn die Kapazität dies zulässt, und gibt den Erfolgsstatus zurück
    • getStudents(): array: gibt das Array der eingeschriebenen Studierenden zurück
  • Platform.php: Binde die Course- und Student-Dateien ein. Erstelle eine Platform-Klasse, die das gesamte System verwaltet. Speichere Kurse und Benutzer in privaten Arrays. Implementiere:
    • addCourse(Course $course): void: fügt der Plattform einen Kurs hinzu
    • findCourse(string $title): ?Course: findet einen Kurs anhand seines Titels
    • enrollStudent(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ück
    • getCourseStats(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 createCourse des 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 von enrollStudent() aus
    • "progress": Aktualisiere den Fortschritt des Studierenden; gib "[name] progress in [course]: [percent]%" aus
    • "stats": Gib das Ergebnis von getCourseStats() 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

Übe selbstständig: Online-PHP-Compiler