Платформа электронного обучения
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 88 из 91.
Задание
ЛегкоДавайте создадим платформу электронного обучения, которая управляет курсами, студентами и преподавателями. Это комплексное задание объединяет наследование, интерфейсы, инкапсуляцию и шаблоны проектирования в единую систему.
Вы организуете код в шести файлах:
User.php: Создайте абстрактный классUser, который служит базовым классом для студентов и преподавателей. Используйте продвижение параметров конструктора для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"
// Создать нового Student и зачислить их
// Вывести результат из enrollStudent()
// TODO: Обработать операцию "progress"
// Обновить прогресс студента
// Вывести "[name] progress in [course]: [percent]%"
// TODO: Обработать операцию "stats"
// Вывести результат из getCourseStats()
}
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy15Финальные задания
Платформа электронного обученияБанковская системаРазработка игрового персонажаСервис аренды транспортных средствПотренируйтесь самостоятельно: Онлайн-компилятор PHP