Menu
Coddy logo textTech

Plataforma de E-Learning

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy — lição 88 de 91.

challenge icon

Desafio

Fácil

Vamos construir uma Plataforma de E-Learning que gerencia cursos, alunos e instrutores. Este desafio abrangente reúne herança, interfaces, encapsulamento e padrões de design em um sistema coeso.

Você organizará seu código em seis arquivos:

  • User.php — Crie uma classe abstrata User que sirva como base para alunos e instrutores. Use a promoção de construtor para id (int) e name (string), ambos public readonly. Inclua um método abstrato getRole(): string que as classes filhas devem implementar.
  • Student.php — Inclua o arquivo User. Crie uma classe Student que estende User. Os alunos rastreiam seus cursos matriculados em um array privado e seu progresso (porcentagem concluída) para cada curso. Implemente:
    • getRole(): string — retorna "Student"
    • enrollInCourse(Course $course): string — matricula o aluno se o curso tiver capacidade; retorna uma mensagem de sucesso ou falha
    • getEnrolledCourses(): array — retorna o array de cursos matriculados
    • updateProgress(string $courseTitle, int $percent): void — define o progresso de um curso (0-100)
    • getProgress(string $courseTitle): int — retorna a porcentagem de progresso, ou 0 se não estiver matriculado
  • Instructor.php — Inclua o arquivo User. Crie uma classe Instructor que estende User. Os instrutores podem criar e gerenciar cursos. Implemente:
    • getRole(): string — retorna "Instructor"
    • createCourse(string $title, int $capacity): Course — cria e retorna um novo Course com este instrutor atribuído
  • Course.php — Inclua o arquivo Instructor. Crie uma classe Course com promoção de construtor para title (string, public readonly), instructor (Instructor, public readonly) e capacity (int, private). Rastreie os alunos matriculados em um array privado. Implemente:
    • getCapacity(): int — retorna a capacidade máxima
    • getEnrolledCount(): int — retorna a contagem atual de matrículas
    • hasCapacity(): bool — retorna true se mais alunos puderem se matricular
    • addStudent(Student $student): bool — adiciona o aluno se a capacidade permitir, retorna o status de sucesso
    • getStudents(): array — retorna o array de alunos matriculados
  • Platform.php — Inclua os arquivos Course e Student. Crie uma classe Platform que gerencia todo o sistema. Armazene cursos e usuários em arrays privados. Implemente:
    • addCourse(Course $course): void — adiciona um curso à plataforma
    • findCourse(string $title): ?Course — encontra um curso pelo título
    • enrollStudent(Student $student, string $courseTitle): string — matricula um aluno em um curso. Retorne "Course not found", "Course is full" ou "[name] enrolled in [title]"
    • getCourseStats(string $title): string — retorna "[title]: [enrolled]/[capacity] students" ou "Course not found"
  • main.php — Inclua o arquivo Platform. Você receberá três entradas: dados do instrutor (JSON), cursos a serem criados (JSON) e operações a serem realizadas (JSON).

    Formato JSON do Instrutor:

    {"id": 1, "name": "Dr. Smith"}

    Formato JSON dos Cursos:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    Formato JSON das Operações:

    [{"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"}]

    Crie a plataforma, o instrutor e todos os cursos (usando o método createCourse do instrutor). Adicione os cursos à plataforma. Em seguida, processe cada operação:

    • "enroll" — Crie um novo Student e matricule-o; imprima o resultado de enrollStudent()
    • "progress" — Atualize o progresso do aluno; imprima "[name] progress in [course]: [percent]%"
    • "stats" — Imprima o resultado de getCourseStats()

    Mantenha o controle dos alunos criados por seu ID para que você possa atualizar seu progresso mais tarde. Imprima o resultado de cada operação em uma nova linha.

Este desafio demonstra como a herança cria uma hierarquia de usuários limpa, o encapsulamento protege os dados de matrícula e a plataforma atua como um coordenador gerenciando os relacionamentos entre cursos, alunos e instrutores.

Experimente você mesmo

<?php

require_once 'Platform.php';

// Ler entradas
$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: Criar a plataforma

// TODO: Criar o instrutor a partir de instructorData

// TODO: Criar todos os cursos usando o método createCourse do instrutor
// e adicioná-los à plataforma

// TODO: Acompanhar os alunos criados pelo seu ID
$students = [];

// TODO: Processar cada operação
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Lidar com a operação "enroll"
    // Criar um novo Aluno e matriculá-lo
    // Imprimir o resultado de enrollStudent()
    
    // TODO: Lidar com a operação "progress"
    // Atualizar o progresso do aluno
    // Imprimir "[name] progress in [course]: [percent]%"
    
    // TODO: Lidar com a operação "stats"
    // Imprimir o resultado de getCourseStats()
}

?>

Todas as lições de Programação Orientada a Objetos