回顾:学生记录系统
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 43 课,共 91 课。
挑战
简单让我们构建一个学生档案系统,把你在本章学到的所有封装概念结合起来。你将创建一个结构清晰的系统,使用构造函数属性提升、私有属性、带验证的 getter 和 setter,以及信息隐藏,安全地管理学生数据。
你将把代码分成三个文件:
Student.php:创建一个Student类,使用构造函数属性提升来声明私有的$name(字符串)和私有的$studentId(字符串)。另外,还要包含一个私有的$grades数组属性(初始化为空)。学生对象应包含:getName():返回学生的姓名getStudentId():返回学生 IDaddGrade(int $grade):仅当成绩在 0 到 100 之间(含两端)时才添加getAverage():以浮点数形式返回所有成绩的平均值(没有成绩时返回 0.0)getGradeCount():返回记录的成绩数量
Classroom.php:创建一个Classroom类,用于管理一组学生。使用私有数组存储学生。引入 Student 文件。课堂对象应包含:- 一个构造函数,使用构造函数属性提升接收私有的
$roomName(字符串) addStudent(Student $student):将一名学生添加到课堂中getStudentCount():返回已注册的学生数量getClassAverage():计算所有学生平均成绩的平均值(没有学生或没有成绩时返回 0.0)getRoomName():返回课堂名称
- 一个构造函数,使用构造函数属性提升接收私有的
main.php:引入 Classroom 文件。你将收到五项输入:教室名称、学生姓名、学生 ID,以及两个成绩。使用教室名称创建一个Classroom。使用姓名和 ID 创建一个Student,添加两个成绩(转换为整数),然后将该学生添加到课堂中。打印四行内容:- 教室名称
- 学生姓名,后面跟着保留 1 位小数的平均成绩:
"[name]: [average]" - 该学生的成绩数量
- 保留 1 位小数的班级平均成绩
这个系统展示了恰当的封装:成绩受到保护,无法被直接修改;平均值在内部计算,不会暴露原始数据;所有数据都通过受控的方法流转。课堂不需要知道学生如何计算自己的平均成绩,只需获取结果即可。
亲手试试
<?php
require_once 'Classroom.php';
// 读取输入
$roomName = trim(fgets(STDIN));
$studentName = trim(fgets(STDIN));
$studentId = trim(fgets(STDIN));
$grade1 = intval(trim(fgets(STDIN)));
$grade2 = intval(trim(fgets(STDIN)));
// TODO:用教室名称创建一个 Classroom 对象
// TODO:用姓名和 ID 创建一个 Student 对象
// TODO:将两项成绩添加到该学生的记录中
// TODO:将该学生添加到教室中
// TODO:输出教室名称
// TODO:输出学生姓名,后面接保留 1 位小数的平均分,格式为 "[name]: [average]"
// TODO:输出该学生的成绩数量
// TODO:输出保留 1 位小数的班级平均分
?>面向对象编程中的所有课
自己练习: PHP 在线编译器