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.
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ượngUserlà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 choid(int) vàname(string), cả hai đều có phạm vi public readonly. Thêm phương thức trừu tượnggetRole(): stringmà các lớp con phải triển khai.Student.php: Nạp tệp User. Tạo lớpStudentkế thừaUser. 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ạigetEnrolledCourses(): 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ớpInstructorkế thừaUser. 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ớpCoursevới tính năng khai báo thuộc tính trong hàm khởi tạo chotitle(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 đagetEnrolledCount(): 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ônggetStudents(): 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ớpPlatformđể 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ảngfindCourse(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
createCoursecủ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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa $thisPhương thứcThuộc tínhHàm khởi tạo (__construct)Hàm hủy (__destruct)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnTừ khóa parent::Ghi đè phương thứcTừ khóa finalLớp trừu tượngÔn tập: hệ thống phân cấp nhân viên7Đóng gói
Công khai, được bảo vệ, riêng tưTìm hiểu sâu về bộ điều chỉnh quyền truy cậpGetter và setterẨn thông tinRút gọn hàm khởi tạo (8.0)Ôn tập: hệ thống hồ sơ học sinh2Không gian tên và tự động nạp
Giới thiệu về không gian tênTừ khóa useChuẩn tự động nạp PSR-4Trình tự động nạp của ComposerÔn tập: dự án có tổ chức5Giao diện và hợp đồng
Giới thiệu về giao diệnTriển khai giao diệnTriển khai nhiều giao diệnGiao diện và lớp trừu tượngGợi ý kiểu với giao diệnÔn tập: Máy tính hình học8Phương thức ma thuật
Giới thiệu về phương thức ma thuật__toString và __debugInfo__get, __set, __isset, __unset__call và __callStatic__clone và sao chép đối tượng__serialize và __unserializeÔn tập: Bộ sưu tập tùy chỉnh3Thuộc tính của lớp
Thuộc tính instance và staticHằng số trong lớpPhương thức và thuộc tính staticThuộc tính private và protectedThuộc tính chỉ đọc (PHP 8.1)Ôn tập: Trình quản lý tài khoản ngân hàng6Đa hình
Xem lại việc ghi đè phương thứcĐa hình qua giao diệnGợi ý kiểu và kiểu hợpLiên kết tĩnh muộnÔn tập: bộ xử lý thanh toán9Đặc tính
Giới thiệu về đặc tínhSử dụng nhiều đặc tínhGiải quyết xung đột giữa các đặc tínhPhương thức trừu tượng trong đặc tínhĐặc tính và kế thừa15Thử thách cuối cùng
Nền tảng học trực tuyếnHệ thống ngân hàngPhát triển nhân vật trong gameDịch vụ cho thuê phương tiệnTự luyện tập: Trình biên dịch PHP online