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.
Desafío
FácilConstruyamos 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 abstractaUserque sirva como base tanto para estudiantes como para instructores. Usa la promoción del constructor paraid(int) yname(string), ambos públicos y de solo lectura. Incluye un método abstractogetRole(): stringque las clases secundarias deben implementar.Student.php: Incluye el archivo User. Crea una claseStudentque extiendaUser. 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 errorgetEnrolledCourses(): array: devuelve el array de cursos inscritosupdateProgress(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 claseInstructorque extiendaUser. 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 del constructor paratitle(string, público y de solo lectura),instructor(Instructor, público y de solo lectura) ycapacity(int, privado). Registra a los estudiantes inscritos en un array privado. Implementa:getCapacity(): int: devuelve la capacidad máximagetEnrolledCount(): int: devuelve el número actual de inscripcioneshasCapacity(): bool: devuelve true si pueden inscribirse más estudiantesaddStudent(Student $student): bool: añade al estudiante si la capacidad lo permite y 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 los 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 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
createCoursedel 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 deenrollStudent()"progress": Actualiza el progreso del estudiante; imprime"[name] progress in [course]: [percent]%""stats": Imprime el resultado degetCourseStats()
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
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - 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 __unserializeRepaso: 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)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la 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 aprendizaje electrónicoSistema bancarioDesarrollo de personajes de videojuegosServicio de alquiler de vehículosPractica por tu cuenta: Compilador de PHP online