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

Lassen 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 Klasse User, die als Basis für Studenten und Instruktoren dient. Verwenden Sie Constructor Promotion für id (int) und name (string), beide public readonly. Fügen Sie eine abstrakte Methode getRole(): string hinzu, die Kindklassen implementieren müssen.
  • Student.php — Binden Sie die User-Datei ein. Erstellen Sie eine Klasse Student, die User erweitert. 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ück
    • enrollInCourse(Course $course): string — schreibt den Studenten ein, wenn der Kurs Kapazität hat; gibt eine Erfolgs- oder Fehlermeldung zurück
    • getEnrolledCourses(): array — gibt das Array der eingeschriebenen 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 nicht eingeschrieben
  • Instructor.php — Binden Sie die User-Datei ein. Erstellen Sie eine Klasse Instructor, die User erweitert. Instruktoren können Kurse erstellen und verwalten. Implementieren Sie:
    • getRole(): string — gibt "Instructor" zurück
    • createCourse(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 Klasse Course mit Constructor Promotion für title (string, public readonly), instructor (Instructor, public readonly) und capacity (int, private). Verfolgen Sie eingeschriebene Studenten in einem privaten Array. Implementieren Sie:
    • 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 weitere Studenten einschreiben können
    • addStudent(Student $student): bool — fügt einen Studenten hinzu, wenn die Kapazität es erlaubt, und gibt den Erfolgsstatus zurück
    • getStudents(): array — gibt das Array der eingeschriebenen Studenten zurück
  • Platform.php — Binden Sie die Course- und Student-Dateien ein. Erstellen Sie eine Klasse Platform, 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 hinzu
    • findCourse(string $title): ?Course — findet einen Kurs anhand des Titels
    • enrollStudent(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ück
    • getCourseStats(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 createCourse des 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 von enrollStudent() aus
    • "progress" — Aktualisieren Sie den Fortschritt des Studenten; geben Sie "[name] progress in [course]: [percent]%" aus
    • "stats" — Geben Sie das Ergebnis von getCourseStats() 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