Menu
Coddy logo textTech

Платформа онлайн-обучения

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 88 из 91.

challenge icon

Задание

Легко

Давайте создадим 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()
}

?>

Все уроки раздела Объектно-ориентированное программирование