Plateforme d'E-Learning
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy — leçon 88 sur 91.
Défi
FacileConstruisons une Plateforme d'E-Learning qui gère des cours, des étudiants et des instructeurs. Ce défi complet rassemble l'héritage, les interfaces, l'encapsulation et les patrons de conception dans un système cohérent.
Vous organiserez votre code sur six fichiers :
User.php— Créez une classe abstraiteUserqui sert de base aux étudiants et aux instructeurs. Utilisez la promotion de constructeur pourid(int) etname(string), tous deux en public readonly. Incluez une méthode abstraitegetRole(): stringque les classes enfants doivent implémenter.Student.php— Incluez le fichier User. Créez une classeStudentétendantUser. Les étudiants suivent leurs cours inscrits dans un tableau privé et leur progression (pourcentage complété) pour chaque cours. Implémentez :getRole(): string— retourne"Student"enrollInCourse(Course $course): string— inscrit l'étudiant si le cours a de la capacité ; retourne un message de succès ou d'échecgetEnrolledCourses(): array— retourne le tableau des cours inscritsupdateProgress(string $courseTitle, int $percent): void— définit la progression pour un cours (0-100)getProgress(string $courseTitle): int— retourne le pourcentage de progression, ou 0 s'il n'est pas inscrit
Instructor.php— Incluez le fichier User. Créez une classeInstructorétendantUser. Les instructeurs peuvent créer et gérer des cours. Implémentez :getRole(): string— retourne"Instructor"createCourse(string $title, int $capacity): Course— crée et retourne un nouveau Course avec cet instructeur assigné
Course.php— Incluez le fichier Instructor. Créez une classeCourseavec la promotion de constructeur pourtitle(string, public readonly),instructor(Instructor, public readonly), etcapacity(int, private). Suivez les étudiants inscrits dans un tableau privé. Implémentez :getCapacity(): int— retourne la capacité maximalegetEnrolledCount(): int— retourne le nombre actuel d'inscriptionshasCapacity(): bool— retourne true si plus d'étudiants peuvent s'inscrireaddStudent(Student $student): bool— ajoute l'étudiant si la capacité le permet, retourne le statut de succèsgetStudents(): array— retourne le tableau des étudiants inscrits
Platform.php— Incluez les fichiers Course et Student. Créez une classePlatformqui gère l'ensemble du système. Stockez les cours et les utilisateurs dans des tableaux privés. Implémentez :addCourse(Course $course): void— ajoute un cours à la plateformefindCourse(string $title): ?Course— trouve un cours par son titreenrollStudent(Student $student, string $courseTitle): string— inscrit un étudiant à un cours. Retourne"Course not found","Course is full", ou"[name] enrolled in [title]"getCourseStats(string $title): string— retourne"[title]: [enrolled]/[capacity] students"ou"Course not found"
main.php— Incluez le fichier Platform. Vous recevrez trois entrées : les données de l'instructeur (JSON), les cours à créer (JSON), et les opérations à effectuer (JSON).Format JSON de l'instructeur :
{"id": 1, "name": "Dr. Smith"}Format JSON des cours :
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]Format JSON des opérations :
[{"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"}]Créez la plateforme, l'instructeur et tous les cours (en utilisant la méthode
createCoursede l'instructeur). Ajoutez les cours à la plateforme. Traitez ensuite chaque opération :"enroll"— Créez un nouvel étudiant et inscrivez-le ; affichez le résultat deenrollStudent()"progress"— Mettez à jour la progression de l'étudiant ; affichez"[name] progress in [course]: [percent]%""stats"— Affichez le résultat degetCourseStats()
Gardez une trace des étudiants créés par leur ID afin de pouvoir mettre à jour leur progression plus tard. Affichez le résultat de chaque opération sur une nouvelle ligne.
Ce défi démontre comment l'héritage crée une hiérarchie d'utilisateurs propre, comment l'encapsulation protège les données d'inscription, et comment la plateforme agit comme un coordinateur gérant les relations entre les cours, les étudiants et les instructeurs.
Essayez vous-même
<?php
require_once 'Platform.php';
// Lire les entrées
$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: Créer la plateforme
// TODO: Créer l'instructeur à partir de instructorData
// TODO: Créer tous les cours en utilisant la méthode createCourse de l'instructeur
// et les ajouter à la plateforme
// TODO: Suivre les étudiants créés par leur ID
$students = [];
// TODO: Traiter chaque opération
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: Gérer l'opération "enroll"
// Créer un nouvel étudiant et l'inscrire
// Afficher le résultat de enrollStudent()
// TODO: Gérer l'opération "progress"
// Mettre à jour la progression de l'étudiant
// Afficher "[name] progress in [course]: [percent]%"
// TODO: Gérer l'opération "stats"
// Afficher le résultat de getCourseStats()
}
?>Toutes les leçons de Programmation Orientée Objet
1Les bases de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition de méthodeLe mot-clé finalClasses abstraitesRécapitulatif - Hiérarchie des employés7Encapsulation
Public, Protégé, PrivéModificateurs d'accès en détailGetters et SettersMasquage d'informationPromotion de constructeur (8.0)Récapitulatif - Système de gestion d'étudiants10Concepts avancés de la POO
Composition vs HéritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibers (PHP 8.1)Clonage d'objets : analyse approfondieGénérateurs et Itérateurs13Patrons de conception Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode ModèlePatron ÉtatPatron CompositePatron Repository2Espaces de noms et Autoloading
Introduction aux espaces de nomsLe mot-clé useStandard d'Autoloading PSR-4L'Autoloader ComposerRécapitulatif - Projet organisé5Interfaces et Contrats
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesInterface vs Classe AbstraiteType Hinting avec les InterfacesRécapitulatif - Calculateur de Formes8Méthodes magiques
Introduction aux méthodes magiques__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Clonage d'objets__serialize & __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d'instance vs Propriétés statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés readonly (PHP 8.1)Récapitulatif - Gestionnaire de compte bancaire6Polymorphisme
Retour sur la redéfinition de méthodePolymorphisme via les interfacesType Hinting et Types d'unionLiaison statique tardiveRécapitulatif - Processeur de paiement9Traits
Introduction aux TraitsUtilisation de plusieurs TraitsRésolution des conflits de TraitsMéthodes abstraites dans les TraitsTraits vs Héritage12Patrons de conception Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron ObservateurPatron Stratégie15Défis finaux
Plateforme d'E-LearningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules