Menu
Coddy logo textTech

Plateforme d'E-Learning

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'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 abstraite User qui sert de base aux étudiants et aux instructeurs. Utilisez la promotion de constructeur pour id (int) et name (string), tous deux en public readonly. 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 étendant User. 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'échec
    • getEnrolledCourses(): array — retourne le tableau des cours inscrits
    • updateProgress(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 classe Instructor étendant User. 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 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 — retourne la capacité maximale
    • getEnrolledCount(): int — retourne le nombre actuel d'inscriptions
    • hasCapacity(): bool — retourne true si plus d'étudiants peuvent s'inscrire
    • addStudent(Student $student): bool — ajoute l'étudiant si la capacité le permet, retourne le statut de succès
    • getStudents(): array — retourne 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 — trouve un cours par son titre
    • enrollStudent(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 createCourse de 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 de enrollStudent()
    • "progress" — Mettez à jour la progression de l'étudiant ; affichez "[name] progress in [course]: [percent]%"
    • "stats" — Affichez le résultat de getCourseStats()

    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