Menu
Coddy logo textTech

Итоги — Иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 26 из 91.

challenge icon

Задание

Легко

Давайте создадим систему иерархии сотрудников, которая объединит все концепции наследования, изученные вами в этой главе. Вы создадите абстрактный базовый класс, определяющий общие черты для каждого сотрудника, а затем расширите его специализированными типами сотрудников, которые рассчитывают бонусы по-разному.

Вы организуете свой код в четырех файлах:

  • 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())
?>

Все уроки раздела Объектно-ориентированное программирование