Платформа онлайн-обучения
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 88 из 91.
Задание
ЛегкоДавайте создадим E-Learning Platform (платформу электронного обучения), которая управляет курсами, студентами и преподавателями. Эта комплексная задача объединяет наследование, интерфейсы, инкапсуляцию и паттерны проектирования в единую систему.
Вы организуете свой код в шести файлах:
User.php— Создайте абстрактный классUser, который служит базой как для студентов, так и для преподавателей. Используйте продвижение свойств в конструкторе (constructor promotion) дляid(int) иname(string), оба public readonly. Включите абстрактный методgetRole(): string, который должны реализовать дочерние классы.Student.php— Подключите файл User. Создайте классStudent, наследующийUser. Студенты отслеживают свои курсы, на которые они записаны, в приватном массиве, а также свой прогресс (процент завершения) для каждого курса. Реализуйте:getRole(): string— возвращает"Student"enrollInCourse(Course $course): string— записывает студента на курс, если в нем есть свободные места; возвращает сообщение об успехе или ошибкеgetEnrolledCourses(): array— возвращает массив курсов, на которые записан студентupdateProgress(string $courseTitle, int $percent): void— устанавливает прогресс для курса (0-100)getProgress(string $courseTitle): int— возвращает процент прогресса или 0, если студент не записан на курс
Instructor.php— Подключите файл User. Создайте классInstructor, наследующийUser. Преподаватели могут создавать курсы и управлять ими. Реализуйте:getRole(): string— возвращает"Instructor"createCourse(string $title, int $capacity): Course— создает и возвращает новый объект Course с назначенным этим преподавателем
Course.php— Подключите файл Instructor. Создайте классCourseс продвижением свойств в конструкторе дляtitle(string, public readonly),instructor(Instructor, public readonly) иcapacity(int, private). Отслеживайте записанных студентов в приватном массиве. Реализуйте:getCapacity(): int— возвращает максимальную вместимостьgetEnrolledCount(): int— возвращает текущее количество записанных студентовhasCapacity(): bool— возвращает true, если есть свободные места для записиaddStudent(Student $student): bool— добавляет студента, если позволяет вместимость, возвращает статус успехаgetStudents(): array— возвращает массив записанных студентов
Platform.php— Подключите файлы Course и Student. Создайте классPlatform, который управляет всей системой. Храните курсы и пользователей в приватных массивах. Реализуйте:addCourse(Course $course): void— добавляет курс на платформуfindCourse(string $title): ?Course— находит курс по названиюenrollStudent(Student $student, string $courseTitle): string— записывает студента на курс. Возвращает"Course not found","Course is full"или"[name] enrolled in [title]"getCourseStats(string $title): string— возвращает"[title]: [enrolled]/[capacity] students"или"Course not found"
main.php— Подключите файл Platform. Вы получите три входных параметра: данные преподавателя (JSON), курсы для создания (JSON) и операции для выполнения (JSON).Формат JSON преподавателя:
{"id": 1, "name": "Dr. Smith"}Формат JSON курсов:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]Формат 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"}]Создайте платформу, преподавателя и все курсы (используя метод преподавателя
createCourse). Добавьте курсы на платформу. Затем обработайте каждую операцию:"enroll"— Создайте нового студента (Student) и запишите его; выведите результат работыenrollStudent()"progress"— Обновите прогресс студента; выведите"[name] progress in [course]: [percent]%""stats"— Выведите результат работыgetCourseStats()
Отслеживайте созданных студентов по их ID, чтобы позже можно было обновить их прогресс. Выводите результат каждой операции на новой строке.
Эта задача демонстрирует, как наследование создает чистую иерархию пользователей, инкапсуляция защищает данные о записи на курсы, а платформа выступает в роли координатора, управляющего отношениями между курсами, студентами и преподавателями.
Попробуйте сами
<?php
require_once 'Platform.php';
// Чтение входных данных
$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: Создать платформу
// TODO: Создать инструктора из instructorData
// TODO: Создать все курсы, используя метод инструктора createCourse,
// и добавить их на платформу
// TODO: Отслеживать созданных студентов по их ID
$students = [];
// TODO: Обработать каждую операцию
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: Обработать операцию "enroll"
// Создать нового студента и зачислить его
// Вывести результат выполнения enrollStudent()
// TODO: Обработать операцию "progress"
// Обновить прогресс студента
// Вывести "[name] progress in [course]: [percent]%"
// TODO: Обработать операцию "stats"
// Вывести результат выполнения getCourseStats()
}
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy15Финальные испытания
Платформа онлайн-обученияБанковская системаРазработка игрового персонажаСервис аренды транспорта