Menu
Coddy logo textTech

Plataforma de aprendizaje electrónico

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

Construyamos una Plataforma de aprendizaje electrónico que gestione cursos, estudiantes e instructores. Este desafío integral reúne herencia, interfaces, encapsulación 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 del constructor para id (int) y name (string), ambos públicos y de solo lectura. Incluye un método abstracto getRole(): string que las clases secundarias deben implementar.
  • Student.php: Incluye el archivo User. Crea una clase Student que extienda User. Los estudiantes registran 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 de error
    • getEnrolledCourses(): array: devuelve el array de cursos inscritos
    • updateProgress(string $courseTitle, int $percent): void: establece el progreso de 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 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 del constructor para title (string, público y de solo lectura), instructor (Instructor, público y de solo lectura) y capacity (int, privado). Registra a los estudiantes inscritos en un array privado. Implementa:
    • getCapacity(): int: devuelve la capacidad máxima
    • getEnrolledCount(): int: devuelve el número actual de inscripciones
    • hasCapacity(): bool: devuelve true si pueden inscribirse más estudiantes
    • addStudent(Student $student): bool: añade al estudiante si la capacidad lo permite y 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 los 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 que crear (JSON) y operaciones que 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. Después, 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()

    Lleva un registro de los estudiantes creados mediante su ID para que puedas actualizar su progreso más adelante. 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 clara, la encapsulación protege los datos de inscripción y la plataforma actúa como coordinadora, gestionando 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: Realizar un 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 Student e inscribirlo
    // Imprimir el resultado de enrollStudent()
    
    // TODO: Manejar la operación "progress"
    // Actualizar el progreso del estudiante
    // Imprime "[name] progress in [course]: [percent]%"
    
    // TODO: Maneja la operación "stats"
    // Imprime el resultado de getCourseStats()
}

?>

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online