Menu
CoddyTech

回顾:学生记录系统

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 43 课,共 91 课。

challenge icon

挑战

简单

让我们构建一个学生档案系统,把你在本章学到的所有封装概念结合起来。你将创建一个结构清晰的系统,使用构造函数属性提升、私有属性、带验证的 getter 和 setter,以及信息隐藏,安全地管理学生数据。

你将把代码分成三个文件:

  • Student.php:创建一个 Student 类,使用构造函数属性提升来声明私有的 $name(字符串)和私有的 $studentId(字符串)。另外,还要包含一个私有的 $grades 数组属性(初始化为空)。学生对象应包含:
    • getName():返回学生的姓名
    • getStudentId():返回学生 ID
    • addGrade(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 在线编译器