Повторение — иерархия сотрудников
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 26 из 91.
Задание
ЛегкоДавайте создадим систему иерархии сотрудников, которая объединит все изученные вами в этой главе концепции наследования. Вы создадите abstract базовый class, определяющий, что должно быть у каждого сотрудника, а затем расширите его специализированными типами сотрудников, которые по-разному рассчитывают бонусы.
Вы организуете код в четырех файлах:
Employee.php: Define abstractEmployeeclass, который служит основой для всех типов сотрудников. У него должны быть protected properties$nameи$salary. constructor accepts оба значения и устанавливает их. Добавьте methodgetName(), который returns имя, methodgetSalary(), который returns зарплату, и abstract methodcalculateBonus(), который дочерние классы должны Implement. Также Add methodgetSummary(), который returns"[name] earns $[salary] with bonus: $[bonus]", где[bonus]— результат вызоваcalculateBonus().Manager.php: Define classManager, который extendsEmployee. Подключите файл Employee в начале. Менеджеры получают бонус в виде процента. Add protected property$bonusPercentage. constructor должен accepts имя, зарплату и процент бонуса: используйтеparent::__construct()для первых двух значений, затем самостоятельно установите процент. ImplementcalculateBonus(), чтобы он returns зарплату, умноженную на процент бонуса и разделенную на 100.Developer.php: Define classDeveloper, который extendsEmployee. Подключите файл Employee в начале. Разработчики получают фиксированный бонус за завершение project. Add protected property$projectBonus. constructor должен accepts имя, зарплату и amount бонуса за project: используйтеparent::__construct()для первых двух значений, затем самостоятельно установите бонус за project. ImplementcalculateBonus(), чтобы он просто returns фиксированный amount бонуса за project.main.php: Подключите оба файла — Manager и Developer. Вы получите шесть inputs: имя manager, зарплата manager, процент бонуса manager, имя developer, зарплата developer и бонус за project developer. CreateManagerиDeveloperс этими значениями. Print результат вызоваgetSummary()сначала для manager, затем для developer, каждый результат — на отдельной строке.
Это challenge демонстрирует, как abstract classes обеспечивают соблюдение контракта: каждый сотрудник должен уметь рассчитывать свой бонус, но логика расчета различается в зависимости от роли. Manager использует процент от своей зарплаты, а Developer получает фиксированную сумму. Общий method getSummary() в parent class без проблем работает с любым расчетом бонуса благодаря полиморфизму.
Попробуйте сами
<?php
require_once 'Manager.php';
require_once 'Developer.php';
// Читать входные данные
$managerName = trim(fgets(STDIN));
$managerSalary = floatval(trim(fgets(STDIN)));
$managerBonusPercentage = floatval(trim(fgets(STDIN)));
$developerName = trim(fgets(STDIN));
$developerSalary = floatval(trim(fgets(STDIN)));
$developerProjectBonus = floatval(trim(fgets(STDIN)));
// TODO: Создать объект Manager с входными данными менеджера
// TODO: Создать объект Developer с входными данными разработчика
// TODO: Вывести сводку менеджера (getSummary())
// TODO: Вывести сводку разработчика (getSummary())
?>Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP