Menu
Coddy logo textTech

Plataforma de E-Learning

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 88 de 91.

challenge icon

Desafío

Fácil

Vamos a construir una Plataforma de E-Learning que gestione cursos, estudiantes e instructores. Este desafío integral reúne herencia, interfaces, encapsulamiento y patrones de diseño en un sistema cohesivo.

Organizarás tu código en seis archivos:

  • User.php — Crea una clase abstracta User que sirva como base tanto para estudiantes como para instructores. Usa la promoción de constructor para id (int) y name (string), ambos public readonly. Incluye un método abstracto getRole(): string que las clases hijas deben implementar.
  • Student.php — Incluye el archivo User. Crea una clase Student que extienda de User. Los estudiantes rastrean sus cursos inscritos en un array privado y su progreso (porcentaje completado) para cada curso. Implementa:
    • getRole(): string — devuelve "Student"
    • enrollInCourse(Course $course): string — inscribe al estudiante si el curso tiene capacidad; devuelve un mensaje de éxito o fallo
    • getEnrolledCourses(): array — devuelve el array de cursos inscritos
    • updateProgress(string $courseTitle, int $percent): void — establece el progreso para un curso (0-100)
    • getProgress(string $courseTitle): int — devuelve el porcentaje de progreso, o 0 si no está inscrito
  • Instructor.php — Incluye el archivo User. Crea una clase Instructor que extienda de User. Los instructores pueden crear y gestionar cursos. Implementa:
    • getRole(): string — devuelve "Instructor"
    • createCourse(string $title, int $capacity): Course — crea y devuelve un nuevo Course con este instructor asignado
  • Course.php — Incluye el archivo Instructor. Crea una clase Course con promoción de constructor para title (string, public readonly), instructor (Instructor, public readonly), y capacity (int, private). Rastrea a los estudiantes inscritos en un array privado. Implementa:
    • getCapacity(): int — devuelve la capacidad máxima
    • getEnrolledCount(): int — devuelve el recuento actual de inscritos
    • hasCapacity(): bool — devuelve true si se pueden inscribir más estudiantes
    • addStudent(Student $student): bool — añade al estudiante si la capacidad lo permite, devuelve el estado de éxito
    • getStudents(): array — devuelve el array de estudiantes inscritos
  • Platform.php — Incluye los archivos Course y Student. Crea una clase Platform que gestione todo el sistema. Almacena cursos y usuarios en arrays privados. Implementa:
    • addCourse(Course $course): void — añade un curso a la plataforma
    • findCourse(string $title): ?Course — busca un curso por título
    • enrollStudent(Student $student, string $courseTitle): string — inscribe a un estudiante en un curso. Devuelve "Course not found", "Course is full", o "[name] enrolled in [title]"
    • getCourseStats(string $title): string — devuelve "[title]: [enrolled]/[capacity] students" o "Course not found"
  • main.php — Incluye el archivo Platform. Recibirás tres entradas: datos del instructor (JSON), cursos a crear (JSON) y operaciones a realizar (JSON).

    Formato JSON del Instructor:

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

    Formato JSON de los Cursos:

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

    Formato JSON de las Operaciones:

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

    Crea la plataforma, el instructor y todos los cursos (usando el método createCourse del instructor). Añade los cursos a la plataforma. Luego procesa cada operación:

    • "enroll" — Crea un nuevo Student e inscríbelo; imprime el resultado de enrollStudent()
    • "progress" — Actualiza el progreso del estudiante; imprime "[name] progress in [course]: [percent]%"
    • "stats" — Imprime el resultado de getCourseStats()

    Mantén un registro de los estudiantes creados por su ID para que puedas actualizar su progreso más tarde. Imprime el resultado de cada operación en una línea nueva.

Este desafío demuestra cómo la herencia crea una jerarquía de usuarios limpia, el encapsulamiento protege los datos de inscripción y la plataforma actúa como un coordinador que gestiona las relaciones entre cursos, estudiantes e instructores.

Pruébalo tú mismo

<?php

require_once 'Platform.php';

// Leer 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: Crear la plataforma

// TODO: Crear el instructor a partir de instructorData

// TODO: Crear todos los cursos usando el método createCourse del instructor
// y añadirlos a la plataforma

// TODO: Mantener el seguimiento de los estudiantes creados por su ID
$students = [];

// TODO: Procesar cada operación
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Manejar la operación "enroll"
    // Crear un nuevo Estudiante e inscribirlo
    // Imprimir el resultado de enrollStudent()
    
    // TODO: Manejar la operación "progress"
    // Actualizar el progreso del estudiante
    // Imprimir "[name] progress in [course]: [percent]%"
    
    // TODO: Manejar la operación "stats"
    // Imprimir el resultado de getCourseStats()
}

?>

Todas las lecciones de Programación Orientada a Objetos