Итоги — Система учета студентов
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 43 из 91.
Задание
ЛегкоДавайте создадим систему учета студентов, которая объединяет все концепции инкапсуляции, изученные вами в этой главе. Вы создадите хорошо организованную систему, которая безопасно управляет данными студентов, используя продвижение конструктора (constructor promotion), закрытые свойства (private properties), геттеры и сеттеры с валидацией, а также сокрытие информации.
Вы организуете свой код в трех файлах:
Student.php— Создайте классStudent, используя продвижение конструктора для закрытого свойства$name(string) и закрытого свойства$studentId(string). Также включите закрытое свойство-массив$grades(инициализированное как пустое). У вашего студента должны быть:getName()— возвращает имя студентаgetStudentId()— возвращает ID студентаaddGrade(int $grade)— добавляет оценку только в том случае, если она находится в диапазоне от 0 до 100 (включительно)getAverage()— возвращает средний балл всех оценок в виде float (возвращает 0.0, если оценок нет)getGradeCount()— возвращает количество записанных оценок
Classroom.php— Создайте классClassroom, который управляет коллекцией студентов. Используйте закрытый массив для хранения студентов. Подключите файл Student. В вашем классе должны быть:- Конструктор, который принимает закрытое свойство
$roomName(string), используя продвижение конструктора addStudent(Student $student)— добавляет студента в классgetStudentCount()— возвращает количество зачисленных студентовgetClassAverage()— вычисляет средний балл среди средних баллов всех студентов (возвращает 0.0, если нет студентов или оценок)getRoomName()— возвращает название класса
- Конструктор, который принимает закрытое свойство
main.php— Подключите файл Classroom. Вы получите пять входных данных: название комнаты, имя студента, ID студента и два значения оценок. Создайте объектClassroomс названием комнаты. Создайте объектStudentс именем и ID, добавьте обе оценки (преобразованные в целые числа), затем добавьте студента в класс. Выведите четыре строки:- Название комнаты
- Имя студента, за которым следует его средний балл, отформатированный до 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: Создать объект Student с именем и ID
// TODO: Добавить обе оценки студенту
// TODO: Добавить студента в класс
// TODO: Вывести название комнаты
// TODO: Вывести имя студента и его средний балл, отформатированный до 1 знака после запятой: "[name]: [average]"
// TODO: Вывести количество оценок этого студента
// TODO: Вывести средний балл класса, отформатированный до 1 знака после запятой
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy