Menu
CoddyTech

Nền tảng học trực tuyến

Thuộc phần Lập trình hướng đối tượng trong hành trình PHP của Coddy. Bài học 88 trên 91.

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một Nền tảng học trực tuyến để quản lý khóa học, học viên và giảng viên. Thử thách toàn diện này kết hợp tính kế thừa, giao diện, tính đóng gói và các mẫu thiết kế thành một hệ thống thống nhất.

Bạn sẽ sắp xếp code trong sáu tệp:

  • User.php: Tạo một lớp trừu tượng User làm lớp cơ sở cho cả học viên và giảng viên. Dùng tính năng khai báo thuộc tính trong hàm khởi tạo cho id (int) và name (string), cả hai đều có phạm vi public readonly. Thêm phương thức trừu tượng getRole(): string mà các lớp con phải triển khai.
  • Student.php: Nạp tệp User. Tạo lớp Student kế thừa User. Học viên theo dõi các khóa học đã đăng ký trong một mảng riêng tư và tiến độ (phần trăm hoàn thành) cho từng khóa học. Triển khai:
    • getRole(): string: trả về "Student"
    • enrollInCourse(Course $course): string: đăng ký học viên nếu khóa học còn chỗ; trả về thông báo thành công hoặc thất bại
    • getEnrolledCourses(): array: trả về mảng các khóa học đã đăng ký
    • updateProgress(string $courseTitle, int $percent): void: đặt tiến độ cho một khóa học (0-100)
    • getProgress(string $courseTitle): int: trả về phần trăm tiến độ, hoặc 0 nếu chưa đăng ký
  • Instructor.php: Nạp tệp User. Tạo lớp Instructor kế thừa User. Giảng viên có thể tạo và quản lý khóa học. Triển khai:
    • getRole(): string: trả về "Instructor"
    • createCourse(string $title, int $capacity): Course: tạo và trả về một Course mới, được chỉ định giảng viên này
  • Course.php: Nạp tệp Instructor. Tạo lớp Course với tính năng khai báo thuộc tính trong hàm khởi tạo cho title (string, public readonly), instructor (Instructor, public readonly) và capacity (int, private). Theo dõi học viên đã đăng ký trong một mảng riêng tư. Triển khai:
    • getCapacity(): int: trả về sức chứa tối đa
    • getEnrolledCount(): int: trả về số học viên hiện đã đăng ký
    • hasCapacity(): bool: trả về true nếu còn chỗ cho học viên đăng ký
    • addStudent(Student $student): bool: thêm học viên nếu sức chứa cho phép, trả về trạng thái thành công
    • getStudents(): array: trả về mảng học viên đã đăng ký
  • Platform.php: Nạp các tệp Course và Student. Tạo lớp Platform để quản lý toàn bộ hệ thống. Lưu khóa học và người dùng trong các mảng riêng tư. Triển khai:
    • addCourse(Course $course): void: thêm khóa học vào nền tảng
    • findCourse(string $title): ?Course: tìm khóa học theo tiêu đề
    • enrollStudent(Student $student, string $courseTitle): string: đăng ký học viên vào một khóa học. Trả về "Course not found", "Course is full" hoặc "[name] enrolled in [title]"
    • getCourseStats(string $title): string: trả về "[title]: [enrolled]/[capacity] students" hoặc "Course not found"
  • main.php: Nạp tệp Platform. Bạn sẽ nhận ba đầu vào: dữ liệu giảng viên (JSON), các khóa học cần tạo (JSON) và các thao tác cần thực hiện (JSON).

    Định dạng JSON của giảng viên:

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

    Định dạng JSON của các khóa học:

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

    Định dạng JSON của các thao tác:

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

    Tạo nền tảng, giảng viên và tất cả khóa học (bằng phương thức createCourse của giảng viên). Thêm các khóa học vào nền tảng. Sau đó xử lý từng thao tác:

    • "enroll": Tạo một Student mới và đăng ký cho học viên đó; in kết quả từ enrollStudent()
    • "progress": Cập nhật tiến độ học viên; in "[name] progress in [course]: [percent]%"
    • "stats": In kết quả từ getCourseStats()

    Theo dõi các học viên đã tạo bằng ID của họ để bạn có thể cập nhật tiến độ sau này. In kết quả của mỗi thao tác trên một dòng mới.

Thử thách này minh họa cách tính kế thừa tạo nên hệ thống phân cấp người dùng rõ ràng, tính đóng gói bảo vệ dữ liệu đăng ký và nền tảng đóng vai trò điều phối, quản lý mối quan hệ giữa khóa học, học viên và giảng viên.

Tự làm thử

<?php

require_once 'Platform.php';

// Đọc dữ liệu đầu vào
$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: Tạo nền tảng

// TODO: Tạo giảng viên từ instructorData

// TODO: Tạo tất cả khóa học bằng phương thức createCourse của giảng viên
// và thêm các khóa học đó vào nền tảng

// TODO: Theo dõi học viên đã tạo theo ID của họ
$students = [];

// TODO: Xử lý từng thao tác
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: Xử lý thao tác "enroll"
    // Tạo một Student mới và ghi danh học viên đó
    // In ra kết quả từ enrollStudent()
    
    // TODO: Xử lý thao tác "progress"
    // Cập nhật tiến độ của học viên
    // In ra "[name] progress in [course]: [percent]%"
    
    // TODO: Xử lý thao tác "stats"
    // In ra kết quả từ getCourseStats()
}

?>

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch PHP online