Итоги — Иерархия сотрудников
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 26 из 91.
Задание
ЛегкоДавайте создадим систему иерархии сотрудников, которая объединит все концепции наследования, изученные вами в этой главе. Вы создадите абстрактный базовый класс, определяющий общие черты для каждого сотрудника, а затем расширите его специализированными типами сотрудников, которые рассчитывают бонусы по-разному.
Вы организуете свой код в четырех файлах:
Employee.php— Определите абстрактный классEmployee, который служит основой для всех типов сотрудников. Он должен иметь защищенные свойства$nameи$salary. Конструктор принимает оба значения и устанавливает их. Включите методgetName(), который возвращает имя, методgetSalary(), который возвращает зарплату, и абстрактный методcalculateBonus(), который должны реализовать дочерние классы. Также добавьте методgetSummary(), который возвращает"[name] earns $[salary] with bonus: $[bonus]", где[bonus]— это результат вызоваcalculateBonus().Manager.php— Определите классManager, который расширяетEmployee. Подключите файл Employee в начале. Менеджеры получают бонус в виде процента. Добавьте защищенное свойство$bonusPercentage. Конструктор должен принимать имя, зарплату и процент бонуса — используйтеparent::__construct()для первых двух, а затем установите процент самостоятельно. РеализуйтеcalculateBonus()так, чтобы он возвращал зарплату, умноженную на процент бонуса и деленную на 100.Developer.php— Определите классDeveloper, который расширяетEmployee. Подключите файл Employee в начале. Разработчики получают фиксированный бонус за завершение проекта. Добавьте защищенное свойство$projectBonus. Конструктор должен принимать имя, зарплату и сумму бонуса за проект — используйтеparent::__construct()для первых двух, а затем установите бонус за проект самостоятельно. РеализуйтеcalculateBonus()так, чтобы он просто возвращал фиксированную сумму бонуса за проект.main.php— Подключите файлы Manager и Developer. Вы получите пять входных данных: имя менеджера, зарплату менеджера, процент бонуса менеджера, имя разработчика, зарплату разработчика и бонус разработчика за проект. Создайте объектыManagerиDeveloperс этими значениями. Выведите результат вызоваgetSummary()сначала для менеджера, затем для разработчика, каждый на новой строке.
Эта задача демонстрирует, как абстрактные классы обеспечивают соблюдение контракта — каждый сотрудник должен уметь рассчитывать свой бонус, но логика расчета зависит от роли. Manager использует процент от своей зарплаты, в то время как Developer получает фиксированную сумму. Общий метод getSummary() в родительском классе беспрепятственно работает с любым расчетом бонуса благодаря полиморфизму.
Попробуйте сами
<?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Подробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данных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