復習 - 学生記録システム
CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 43/91。
チャレンジ
簡単この章で学んだすべてのカプセル化の概念を組み合わせた Student Records System を構築しましょう。constructor promotion、private プロパティ、検証付きの getter と setter、情報隠蔽を使用して、学生データを安全に管理する、整理されたシステムを作成します。
コードを3つのファイルに分けて整理します。
Student.php:constructor promotion を使用して、private な$name(string)と private な$studentId(string)を持つStudentclass を作成します。また、private な$gradesarray プロパティ(empty として initialized)も含めます。Student には次の機能を持たせます。getName():学生の名前を返すgetStudentId():学生 ID を返すaddGrade(int $grade):grade が 0 以上 100 以下(inclusive)の場合のみ追加するgetAverage():すべての grade の average を float として返す(grade が存在しない場合は 0.0 を返す)getGradeCount():記録された grade の数を返す
Classroom.php:学生のコレクションを管理するClassroomclass を作成します。学生を格納するために private array を使用します。Student ファイルを include します。Classroom には次の機能を持たせます。- constructor promotion を使用して、private な
$roomName(string)を受け取る constructor addStudent(Student $student):学生を Classroom に追加するgetStudentCount():enrolled している学生の数を返すgetClassAverage():すべての学生の average の average を calculates する(学生がいない、または grade がない場合は 0.0 を返す)getRoomName():Classroom の名前を返す
- constructor promotion を使用して、private な
main.php:Classroom ファイルを include します。room name、student name、student ID、および2つの grade values、合計5つの inputs を受け取ります。room name を使ってClassroomを Create します。name と ID を使ってStudentを Create し、両方の grades(int に converted)を add してから、その student を classroom に add します。4行を Print します。- room name
- 学生の name に続けて、average を小数点以下1桁に formatted したもの:
"[name]: [average]" - その student の grades の数
- 小数点以下1桁に formatted した class average
このシステムは、適切なカプセル化を示しています。grades は直接操作から保護され、averages は raw data を公開せずに内部で calculates され、すべての data は制御された methods を通して流れます。Classroom は、学生がどのように averages を calculates するかを知る必要がありません。結果を尋ねるだけです。
自分で試してみよう
<?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オンラインコンパイラ