在线学习平台
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 88 课,共 91 课。
挑战
简单我们来构建一个电子学习平台,用于管理课程、学生和讲师。这个综合挑战会将继承、接口、封装和设计模式整合到一个完整的系统中。
你将把代码分成 6 个文件:
User.php:创建一个抽象的User类,作为学生和讲师的基类。使用构造函数属性提升来定义id(int)和name(string),并将两者都设为 public readonly。添加一个抽象方法getRole(): string,要求子类实现它。Student.php:引入 User 文件。创建一个继承User的Student类。学生需要用私有数组记录已选课程,以及每门课程的进度(已完成百分比)。实现:getRole(): string:返回"Student"enrollInCourse(Course $course): string:如果课程还有名额,就为学生选课;返回成功或失败消息getEnrolledCourses(): array:返回已选课程数组updateProgress(string $courseTitle, int $percent): void:设置某门课程的进度(0-100)getProgress(string $courseTitle): int:返回进度百分比;如果未选这门课程,则返回 0
Instructor.php:引入 User 文件。创建一个继承User的Instructor类。讲师可以创建和管理课程。实现:getRole(): string:返回"Instructor"createCourse(string $title, int $capacity): Course:创建并返回一门由该讲师负责的新 Course
Course.php:引入 Instructor 文件。创建一个Course类,使用构造函数属性提升定义title(string,public readonly)、instructor(Instructor,public readonly)和capacity(int,private)。使用私有数组记录已选课的学生。实现:getCapacity(): int:返回最大学员人数getEnrolledCount(): int:返回当前选课人数hasCapacity(): bool:如果还能有更多学生选课,则返回 trueaddStudent(Student $student): bool:如果名额允许,就添加学生,并返回操作是否成功getStudents(): array:返回已选课的学生数组
Platform.php:引入 Course 和 Student 文件。创建一个管理整个系统的Platform类。使用私有数组存储课程和用户。实现:addCourse(Course $course): void:将课程添加到平台findCourse(string $title): ?Course:按标题查找课程enrollStudent(Student $student, string $courseTitle): string:为学生选课。返回"Course not found"、"Course is full"或"[name] enrolled in [title]"getCourseStats(string $title): string:返回"[title]: [enrolled]/[capacity] students"或"Course not found"
main.php:引入 Platform 文件。你将收到 3 个输入:讲师数据(JSON)、要创建的课程(JSON)和要执行的操作(JSON)。讲师 JSON 格式:
{"id": 1, "name": "Dr. Smith"}课程 JSON 格式:
[{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]操作 JSON 格式:
[{"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"}]创建平台、讲师和所有课程(使用讲师的
createCourse方法)。将课程添加到平台。然后处理每个操作:"enroll":创建一个新的 Student 并为其选课;打印enrollStudent()的返回结果"progress":更新学生的学习进度;打印"[name] progress in [course]: [percent]%""stats":打印getCourseStats()的返回结果
按学生 ID 记录已创建的学生,这样你之后就能更新他们的学习进度。将每个操作的结果打印在新的一行。
这个挑战展示了继承如何创建清晰的用户层次结构,封装如何保护选课数据,以及平台如何作为协调者管理课程、学生和讲师之间的关系。
亲手试试
<?php
require_once 'Platform.php';
// 读取输入
$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: 创建平台
// TODO: 根据 instructorData 创建讲师
// TODO: 使用讲师的 createCourse 方法创建所有课程
// 并将它们添加到平台
// TODO: 根据 ID 记录已创建的学生
$students = [];
// TODO: 处理每项操作
foreach ($operations as $op) {
$operation = (array)$op;
// TODO: 处理 "enroll" 操作
// 创建一个新的 Student 并为其报名
// 打印 enrollStudent() 的结果
// TODO: 处理 "progress" 操作
// 更新学生的学习进度
// 输出 "[name] progress in [course]: [percent]%"
// TODO: 处理 "stats" 操作
// 输出 getCourseStats() 的结果
}
?>面向对象编程中的所有课
自己练习: PHP 在线编译器