Menu
Coddy logo textTech

Piattaforma di e-learning

Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 88 di 91.

challenge icon

Sfida

Facile

Costruiamo una piattaforma di e-learning che gestisce corsi, studenti e insegnanti. Questa sfida completa riunisce ereditarietà, interfacce, incapsulamento e pattern di progettazione in un sistema coerente.

Organizzerai il codice in sei file:

  • User.php: crea una classe astratta User che funge da base sia per gli studenti sia per gli insegnanti. Usa la promozione delle proprietà del costruttore per id (int) e name (string), entrambi public readonly. Includi un metodo astratto getRole(): string che le classi figlie devono implementare.
  • Student.php: includi il file User. Crea una classe Student che estende User. Gli studenti tengono traccia dei corsi a cui sono iscritti in un array privato e dei progressi (percentuale completata) per ciascun corso. Implementa:
    • getRole(): string: restituisce "Student"
    • enrollInCourse(Course $course): string: iscrive lo studente se il corso ha posti disponibili; restituisce un messaggio di successo o di errore
    • getEnrolledCourses(): array: restituisce l'array dei corsi a cui è iscritto
    • updateProgress(string $courseTitle, int $percent): void: imposta i progressi per un corso (0-100)
    • getProgress(string $courseTitle): int: restituisce la percentuale di progresso, oppure 0 se non è iscritto
  • Instructor.php: includi il file User. Crea una classe Instructor che estende User. Gli insegnanti possono creare e gestire corsi. Implementa:
    • getRole(): string: restituisce "Instructor"
    • createCourse(string $title, int $capacity): Course: crea e restituisce un nuovo Course assegnandogli questo insegnante
  • Course.php: includi il file Instructor. Crea una classe Course con la promozione delle proprietà del costruttore per title (string, public readonly), instructor (Instructor, public readonly) e capacity (int, private). Tieni traccia degli studenti iscritti in un array privato. Implementa:
    • getCapacity(): int: restituisce la capienza massima
    • getEnrolledCount(): int: restituisce il numero attuale di iscritti
    • hasCapacity(): bool: restituisce true se possono iscriversi altri studenti
    • addStudent(Student $student): bool: aggiunge lo studente se la capienza lo consente e restituisce lo stato dell'operazione
    • getStudents(): array: restituisce l'array degli studenti iscritti
  • Platform.php: includi i file Course e Student. Crea una classe Platform che gestisce l'intero sistema. Memorizza corsi e utenti in array privati. Implementa:
    • addCourse(Course $course): void: aggiunge un corso alla piattaforma
    • findCourse(string $title): ?Course: trova un corso per titolo
    • enrollStudent(Student $student, string $courseTitle): string: iscrive uno studente a un corso. Restituisci "Course not found", "Course is full" oppure "[name] enrolled in [title]"
    • getCourseStats(string $title): string: restituisce "[title]: [enrolled]/[capacity] students" oppure "Course not found"
  • main.php: includi il file Platform. Riceverai tre input: i dati dell'insegnante (JSON), i corsi da creare (JSON) e le operazioni da eseguire (JSON).

    Formato JSON dell'insegnante:

    {"id": 1, "name": "Dr. Smith"}

    Formato JSON dei corsi:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    Formato JSON delle operazioni:

    [{"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 piattaforma, l'insegnante e tutti i corsi (usando il metodo createCourse dell'insegnante). Aggiungi i corsi alla piattaforma. Poi elabora ogni operazione:

    • "enroll": crea un nuovo Student e iscrivilo; stampa il risultato di enrollStudent()
    • "progress": aggiorna i progressi dello studente; stampa "[name] progress in [course]: [percent]%"
    • "stats": stampa il risultato di getCourseStats()

    Tieni traccia degli studenti creati tramite il loro ID, così da poter aggiornare i loro progressi in seguito. Stampa il risultato di ogni operazione su una nuova riga.

Questa sfida mostra come l'ereditarietà crei una gerarchia di utenti chiara, l'incapsulamento protegga i dati delle iscrizioni e la piattaforma funga da coordinatore nella gestione delle relazioni tra corsi, studenti e insegnanti.

Provalo tu

<?php

require_once 'Platform.php';

// Leggi gli input
$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: Crea la piattaforma

// TODO: Crea l'istruttore a partire da instructorData

// TODO: Crea tutti i corsi usando il metodo createCourse dell'istruttore
// e aggiungili alla piattaforma

// TODO: Tieni traccia degli studenti creati tramite il loro ID
$students = [];

// TODO: Elabora ogni operazione
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Gestisci l'operazione "enroll"
    // Crea un nuovo Student e iscrivilo
    // Stampa il risultato di enrollStudent()
    
    // TODO: Gestisci l'operazione "progress"
    // Aggiorna i progressi dello studente
    // Stampa "[name] progress in [course]: [percent]%"
    
    // TODO: Gestisci l'operazione "stats"
    // Stampa il risultato di getCourseStats()
}

?>

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore PHP online