Menu
Coddy logo textTech

Платформа электронного обучения

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

challenge icon

Задание

Легко

Давайте создадим платформу электронного обучения, которая управляет курсами, студентами и преподавателями. Это комплексное задание объединяет наследование, интерфейсы, инкапсуляцию и шаблоны проектирования в единую систему.

Вы организуете код в шести файлах:

  • 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()
}

?>

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP