Menu
CoddyTech

Platform E-Learning

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 88 dari 91.

challenge icon

Tantangan

Mudah

Mari kita bangun Platform E-Learning yang mengelola kursus, siswa, dan instruktur. Tantangan menyeluruh ini menggabungkan pewarisan, antarmuka, enkapsulasi, dan pola desain menjadi satu sistem yang padu.

Kamu akan mengatur kodemu dalam enam file:

  • User.php: Buat class User abstrak yang menjadi dasar bagi siswa dan instruktur. Gunakan promosi konstruktor untuk id (int) dan name (string), keduanya public readonly. Sertakan method abstrak getRole(): string yang harus diimplementasikan oleh class turunan.
  • Student.php: Sertakan file User. Buat class Student yang mewarisi User. Siswa menyimpan kursus yang diikuti dalam array private dan progres (persentase penyelesaian) untuk setiap kursus. Implementasikan:
    • getRole(): string: mengembalikan "Student"
    • enrollInCourse(Course $course): string: mendaftarkan siswa jika kursus masih memiliki kapasitas; mengembalikan pesan berhasil atau gagal
    • getEnrolledCourses(): array: mengembalikan array kursus yang diikuti
    • updateProgress(string $courseTitle, int $percent): void: menetapkan progres untuk suatu kursus (0-100)
    • getProgress(string $courseTitle): int: mengembalikan persentase progres, atau 0 jika belum terdaftar
  • Instructor.php: Sertakan file User. Buat class Instructor yang mewarisi User. Instruktur dapat membuat dan mengelola kursus. Implementasikan:
    • getRole(): string: mengembalikan "Instructor"
    • createCourse(string $title, int $capacity): Course: membuat dan mengembalikan Course baru dengan instruktur ini ditetapkan sebagai pengajarnya
  • Course.php: Sertakan file Instructor. Buat class Course dengan promosi konstruktor untuk title (string, public readonly), instructor (Instructor, public readonly), dan capacity (int, private). Simpan siswa yang terdaftar dalam array private. Implementasikan:
    • getCapacity(): int: mengembalikan kapasitas maksimum
    • getEnrolledCount(): int: mengembalikan jumlah siswa yang saat ini terdaftar
    • hasCapacity(): bool: mengembalikan true jika masih ada kapasitas untuk siswa lain
    • addStudent(Student $student): bool: menambahkan siswa jika kapasitas memungkinkan, lalu mengembalikan status keberhasilan
    • getStudents(): array: mengembalikan array siswa yang terdaftar
  • Platform.php: Sertakan file Course dan Student. Buat class Platform yang mengelola seluruh sistem. Simpan kursus dan pengguna dalam array private. Implementasikan:
    • addCourse(Course $course): void: menambahkan kursus ke platform
    • findCourse(string $title): ?Course: mencari kursus berdasarkan judul
    • enrollStudent(Student $student, string $courseTitle): string: mendaftarkan siswa ke kursus. Kembalikan "Course not found", "Course is full", atau "[name] enrolled in [title]"
    • getCourseStats(string $title): string: mengembalikan "[title]: [enrolled]/[capacity] students" atau "Course not found"
  • main.php: Sertakan file Platform. Kamu akan menerima tiga input: data instruktur (JSON), kursus yang akan dibuat (JSON), dan operasi yang akan dilakukan (JSON).

    Format JSON instruktur:

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

    Format JSON kursus:

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

    Format JSON operasi:

    [{"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"}]

    Buat platform, instruktur, dan semua kursus (menggunakan method createCourse milik instruktur). Tambahkan kursus ke platform. Lalu proses setiap operasi:

    • "enroll": Buat Student baru dan daftarkan siswa tersebut; cetak hasil dari enrollStudent()
    • "progress": Perbarui progres siswa; cetak "[name] progress in [course]: [percent]%"
    • "stats": Cetak hasil dari getCourseStats()

    Simpan data siswa yang dibuat berdasarkan ID mereka agar kamu dapat memperbarui progresnya nanti. Cetak hasil setiap operasi pada baris baru.

Tantangan ini menunjukkan bagaimana pewarisan membentuk hierarki pengguna yang rapi, enkapsulasi melindungi data pendaftaran, dan platform berperan sebagai koordinator yang mengelola hubungan antara kursus, siswa, dan instruktur.

Coba sendiri

<?php

require_once 'Platform.php';

// Baca 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: Buat platform

// TODO: Buat instruktur dari instructorData

// TODO: Buat semua kursus menggunakan method createCourse milik instruktur
// dan tambahkan ke platform

// TODO: Lacak siswa yang telah dibuat berdasarkan ID mereka
$students = [];

// TODO: Proses setiap operasi
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Tangani operasi "enroll"
    // Buat Student baru dan daftarkan ke kursus
    // Cetak hasil dari enrollStudent()
    
    // TODO: Tangani operasi "progress"
    // Perbarui progres siswa
    // Cetak "[name] progress in [course]: [percent]%"
    
    // TODO: Tangani operasi "stats"
    // Cetak hasil dari getCourseStats()
}

?>

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online