Plateforme d’apprentissage en ligne
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’apprentissage en ligne qui gère les cours, les étudiants et les formateurs. Ce défi complet rassemble l’héritage, les interfaces, l’encapsulation et les patrons de conception au sein d’un système cohérent.
Vous organiserez votre code dans six fichiers :
User.php: créez une classe abstraiteUserqui sert de base aux étudiants et aux formateurs. Utilisez la promotion de constructeur pourid(int) etname(string), tous deux publics et en lecture seule. Incluez une méthode abstraitegetRole(): stringque les classes enfants doivent implémenter.Student.php: incluez le fichier User. Créez une classeStudentqui étendUser. Les étudiants suivent leurs cours auxquels ils sont inscrits dans un tableau privé, ainsi que leur progression (pourcentage terminé) pour chaque cours. Implémentez :getRole(): string: renvoie"Student"enrollInCourse(Course $course): string: inscrit l’étudiant si le cours a encore de la capacité ; renvoie un message de réussite ou d’échecgetEnrolledCourses(): array: renvoie le tableau des cours auxquels l’étudiant est inscritupdateProgress(string $courseTitle, int $percent): void: définit la progression pour un cours (0-100)getProgress(string $courseTitle): int: renvoie le pourcentage de progression, ou 0 si l’étudiant n’est pas inscrit
Instructor.php: incluez le fichier User. Créez une classeInstructorqui étendUser. Les formateurs peuvent créer et gérer des cours. Implémentez :getRole(): string: renvoie"Instructor"createCourse(string $title, int $capacity): Course: crée et renvoie un nouveau Course avec ce formateur 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: renvoie la capacité maximalegetEnrolledCount(): int: renvoie le nombre actuel d’inscritshasCapacity(): bool: renvoie true si d’autres étudiants peuvent s’inscrireaddStudent(Student $student): bool: ajoute l’étudiant si la capacité le permet et renvoie le statut de réussitegetStudents(): array: renvoie 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: recherche un cours par titreenrollStudent(Student $student, string $courseTitle): string: inscrit un étudiant à un cours. Renvoyez"Course not found","Course is full"ou"[name] enrolled in [title]"getCourseStats(string $title): string: renvoie"[title]: [enrolled]/[capacity] students"ou"Course not found"
main.php: incluez le fichier Platform. Vous recevrez trois entrées : les données du formateur (JSON), les cours à créer (JSON) et les opérations à effectuer (JSON).Format JSON du formateur :
{"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, le formateur et tous les cours (en utilisant la méthode
createCoursedu formateur). 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()
Conservez les étudiants créés en fonction de leur identifiant afin de pouvoir mettre à jour leur progression ultérieurement. Affichez le résultat de chaque opération sur une nouvelle ligne.
Ce défi montre comment l’héritage crée une hiérarchie claire d’utilisateurs, comment l’encapsulation protège les données d’inscription et comment la plateforme agit comme un coordinateur qui gère les relations entre les cours, les étudiants et les formateurs.
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 Student 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
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy15Défis finaux
Plateforme d’apprentissage en ligneSystème bancaireDéveloppement de personnages de jeuService de location de véhiculesEntraînez-vous par vous-même : Compilateur PHP en ligne