Menu
Coddy logo textTech

Platforma e-learningowa

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 88 z 91.

challenge icon

Wyzwanie

Łatwy

Stwórzmy platformę e-learningową, która zarządza kursami, studentami i instruktorami. To kompleksowe wyzwanie łączy dziedziczenie, interfejsy, enkapsulację i wzorce projektowe w spójny system.

Rozmieścisz swój kod w sześciu plikach:

  • User.php: Utwórz abstrakcyjną klasę User, która będzie klasą bazową zarówno dla studentów, jak i instruktorów. Użyj promocji właściwości konstruktora dla id (int) i name (string), obie właściwości mają być publiczne i tylko do odczytu. Dodaj abstrakcyjną metodę getRole(): string, którą muszą zaimplementować klasy potomne.
  • Student.php: Dołącz plik User. Utwórz klasę Student rozszerzającą User. Studenci przechowują zapisane kursy w prywatnej tablicy oraz postępy (ukończony procent) dla każdego kursu. Zaimplementuj:
    • getRole(): string: zwraca "Student"
    • enrollInCourse(Course $course): string: zapisuje studenta na kurs, jeśli kurs ma wolne miejsca; zwraca komunikat o powodzeniu lub niepowodzeniu
    • getEnrolledCourses(): array: zwraca tablicę zapisanych kursów
    • updateProgress(string $courseTitle, int $percent): void: ustawia postęp dla kursu (0-100)
    • getProgress(string $courseTitle): int: zwraca procentowy postęp lub 0, jeśli student nie jest zapisany
  • Instructor.php: Dołącz plik User. Utwórz klasę Instructor rozszerzającą User. Instruktorzy mogą tworzyć kursy i nimi zarządzać. Zaimplementuj:
    • getRole(): string: zwraca "Instructor"
    • createCourse(string $title, int $capacity): Course: tworzy i zwraca nowy kurs, przypisując do niego tego instruktora
  • Course.php: Dołącz plik Instructor. Utwórz klasę Course z promocją właściwości konstruktora dla title (string, publiczna i tylko do odczytu), instructor (Instructor, publiczna i tylko do odczytu) oraz capacity (int, prywatna). Przechowuj zapisanych studentów w prywatnej tablicy. Zaimplementuj:
    • getCapacity(): int: zwraca maksymalną liczbę miejsc
    • getEnrolledCount(): int: zwraca aktualną liczbę zapisanych studentów
    • hasCapacity(): bool: zwraca true, jeśli mogą zapisać się kolejni studenci
    • addStudent(Student $student): bool: dodaje studenta, jeśli pozwala na to dostępna liczba miejsc, i zwraca informację o powodzeniu
    • getStudents(): array: zwraca tablicę zapisanych studentów
  • Platform.php: Dołącz pliki Course i Student. Utwórz klasę Platform, która zarządza całym systemem. Przechowuj kursy i użytkowników w prywatnych tablicach. Zaimplementuj:
    • addCourse(Course $course): void: dodaje kurs do platformy
    • findCourse(string $title): ?Course: wyszukuje kurs według tytułu
    • enrollStudent(Student $student, string $courseTitle): string: zapisuje studenta na kurs. Zwróć "Course not found", "Course is full" lub "[name] enrolled in [title]"
    • getCourseStats(string $title): string: zwraca "[title]: [enrolled]/[capacity] students" lub "Course not found"
  • main.php: Dołącz plik Platform. Otrzymasz trzy dane wejściowe: dane instruktora (JSON), kursy do utworzenia (JSON) oraz operacje do wykonania (JSON).

    Format danych JSON instruktora:

    {"id": 1, "name": "Dr. Smith"}

    Format danych JSON kursów:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    Format danych JSON operacji:

    [{"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"}]

    Utwórz platformę, instruktora i wszystkie kursy (używając metody createCourse instruktora). Dodaj kursy do platformy. Następnie przetwórz każdą operację:

    • "enroll": Utwórz nowego studenta i zapisz go na kurs; wypisz wynik wywołania enrollStudent()
    • "progress": Zaktualizuj postęp studenta; wypisz "[name] progress in [course]: [percent]%"
    • "stats": Wypisz wynik wywołania getCourseStats()

    Przechowuj utworzonych studentów według ich identyfikatorów, aby móc później zaktualizować ich postępy. Wypisz wynik każdej operacji w nowym wierszu.

To wyzwanie pokazuje, jak dziedziczenie tworzy przejrzystą hierarchię użytkowników, enkapsulacja chroni dane dotyczące zapisów, a platforma pełni rolę koordynatora zarządzającego relacjami między kursami, studentami i instruktorami.

Spróbuj swoich sił

<?php

require_once 'Platform.php';

// Odczytaj dane wejściowe
$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: Utwórz platformę

// TODO: Utwórz instruktora na podstawie instructorData

// TODO: Utwórz wszystkie kursy za pomocą metody createCourse instruktora
// i dodaj je do platformy

// TODO: Śledź utworzonych studentów według ich ID
$students = [];

// TODO: Przetwórz każdą operację
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Obsłuż operację "enroll"
    // Utwórz nowego Student i zapisz go na kurs
    // Wypisz wynik działania enrollStudent()
    
    // TODO: Obsłuż operację "progress"
    // Zaktualizuj postępy studenta
    // Wypisz "[name] progress in [course]: [percent]%"
    
    // TODO: Obsłuż operację "stats"
    // Wypisz wynik getCourseStats()
}

?>

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online