Platforma e-learningowa
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 88 z 91.
Wyzwanie
ŁatwyStwó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 dlaid(int) iname(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ęStudentrozszerzają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 niepowodzeniugetEnrolledCourses(): array: zwraca tablicę zapisanych kursówupdateProgress(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ęInstructorrozszerzają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ęCoursez promocją właściwości konstruktora dlatitle(string, publiczna i tylko do odczytu),instructor(Instructor, publiczna i tylko do odczytu) orazcapacity(int, prywatna). Przechowuj zapisanych studentów w prywatnej tablicy. Zaimplementuj:getCapacity(): int: zwraca maksymalną liczbę miejscgetEnrolledCount(): int: zwraca aktualną liczbę zapisanych studentówhasCapacity(): bool: zwraca true, jeśli mogą zapisać się kolejni studenciaddStudent(Student $student): bool: dodaje studenta, jeśli pozwala na to dostępna liczba miejsc, i zwraca informację o powodzeniugetStudents(): 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 platformyfindCourse(string $title): ?Course: wyszukuje kurs według tytułuenrollStudent(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
createCourseinstruktora). Dodaj kursy do platformy. Następnie przetwórz każdą operację:"enroll": Utwórz nowego studenta i zapisz go na kurs; wypisz wynik wywołaniaenrollStudent()"progress": Zaktualizuj postęp studenta; wypisz"[name] progress in [course]: [percent]%""stats": Wypisz wynik wywołaniagetCourseStats()
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
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy15Wyzwania końcowe
Platforma e-learningowaSystem bankowyTworzenie postaci do gryUsługa wynajmu pojazdówPoćwicz samodzielnie: Kompilator PHP online