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.
Desafío
FácilVamos 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 abstractaUserque sirva como base tanto para estudiantes como para instructores. Usa la promoción de constructor paraid(int) yname(string), ambos public readonly. Incluye un método abstractogetRole(): stringque las clases hijas deben implementar.Student.php— Incluye el archivo User. Crea una claseStudentque extienda deUser. 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 fallogetEnrolledCourses(): array— devuelve el array de cursos inscritosupdateProgress(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 claseInstructorque extienda deUser. 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 claseCoursecon promoción de constructor paratitle(string, public readonly),instructor(Instructor, public readonly), ycapacity(int, private). Rastrea a los estudiantes inscritos en un array privado. Implementa:getCapacity(): int— devuelve la capacidad máximagetEnrolledCount(): int— devuelve el recuento actual de inscritoshasCapacity(): bool— devuelve true si se pueden inscribir más estudiantesaddStudent(Student $student): bool— añade al estudiante si la capacidad lo permite, devuelve el estado de éxitogetStudents(): array— devuelve el array de estudiantes inscritos
Platform.php— Incluye los archivos Course y Student. Crea una clasePlatformque gestione todo el sistema. Almacena cursos y usuarios en arrays privados. Implementa:addCourse(Course $course): void— añade un curso a la plataformafindCourse(string $title): ?Course— busca un curso por títuloenrollStudent(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
createCoursedel instructor). Añade los cursos a la plataforma. Luego procesa cada operación:"enroll"— Crea un nuevo Student e inscríbelo; imprime el resultado deenrollStudent()"progress"— Actualiza el progreso del estudiante; imprime"[name] progress in [course]: [percent]%""stats"— Imprime el resultado degetCourseStats()
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
1Fundamentos de OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - Calculadora de Formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeResumen - Colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy15Desafíos finales
Plataforma de E-LearningSistema bancarioDesarrollo de personajes de videojuegosServicio de alquiler de vehículos