Menu
Coddy logo textTech

Plateforme d’apprentissage en ligne

Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 88 sur 91.

challenge icon

Défi

Facile

Construisons 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 abstraite User qui sert de base aux étudiants et aux formateurs. Utilisez la promotion de constructeur pour id (int) et name (string), tous deux publics et en lecture seule. Incluez une méthode abstraite getRole(): string que les classes enfants doivent implémenter.
  • Student.php : incluez le fichier User. Créez une classe Student qui étend User. 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’échec
    • getEnrolledCourses(): array : renvoie le tableau des cours auxquels l’étudiant est inscrit
    • updateProgress(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 classe Instructor qui étend User. 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 classe Course avec la promotion de constructeur pour title (string, public readonly), instructor (Instructor, public readonly) et capacity (int, private). Suivez les étudiants inscrits dans un tableau privé. Implémentez :
    • getCapacity(): int : renvoie la capacité maximale
    • getEnrolledCount(): int : renvoie le nombre actuel d’inscrits
    • hasCapacity(): bool : renvoie true si d’autres étudiants peuvent s’inscrire
    • addStudent(Student $student): bool : ajoute l’étudiant si la capacité le permet et renvoie le statut de réussite
    • getStudents(): array : renvoie le tableau des étudiants inscrits
  • Platform.php : incluez les fichiers Course et Student. Créez une classe Platform qui 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 plateforme
    • findCourse(string $title): ?Course : recherche un cours par titre
    • enrollStudent(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 createCourse du formateur). Ajoutez les cours à la plateforme. Traitez ensuite chaque opération :

    • "enroll" : créez un nouvel étudiant et inscrivez-le ; affichez le résultat de enrollStudent()
    • "progress" : mettez à jour la progression de l’étudiant ; affichez "[name] progress in [course]: [percent]%"
    • "stats" : affichez le résultat de getCourseStats()

    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

Entraînez-vous par vous-même : Compilateur PHP en ligne