Menu
CoddyTech

回顾:员工层级结构

本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 26 课,共 91 课。

challenge icon

挑战

简单

让我们构建一个员工层级系统,把你在本章中学到的所有继承概念结合起来。你将创建一个抽象基类,定义每位员工都必须具备的内容,然后扩展该类,创建不同类型的员工,并让他们以不同方式计算奖金。

你将把代码分到 4 个文件中:

  • Employee.php:定义一个抽象的 Employee 类,作为所有员工类型的基础。它应包含受保护的属性 $name 和 $salary。构造函数接收这两个值并设置它们。添加一个返回姓名的 getName() 方法、一个返回薪水的 getSalary() 方法,以及一个必须由子类实现的抽象方法 calculateBonus()。再添加一个 getSummary() 方法,返回 "[name] earns $[salary] with bonus: $[bonus]",其中 [bonus] 是调用 calculateBonus() 得到的结果。
  • Manager.php:定义一个继承自 Employee 的 Manager 类。在文件顶部引入 Employee 文件。经理获得按百分比计算的奖金。添加一个受保护的 $bonusPercentage 属性。构造函数应接收姓名、薪水和奖金百分比:前两个值使用 parent::__construct(),然后自行设置百分比。实现 calculateBonus(),使其返回薪水乘以奖金百分比再除以 100 的结果。
  • Developer.php:定义一个继承自 Employee 的 Developer 类。在文件顶部引入 Employee 文件。开发者获得固定的项目完成奖金。添加一个受保护的 $projectBonus 属性。构造函数应接收姓名、薪水和项目奖金金额:前两个值使用 parent::__construct(),然后自行设置项目奖金。实现 calculateBonus(),直接返回固定的项目奖金金额。
  • main.php:引入 Manager 和 Developer 文件。你将收到 6 个输入:经理姓名、经理薪水、经理奖金百分比、开发者姓名、开发者薪水和开发者项目奖金。使用这些值创建一个 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())
?>

面向对象编程中的所有课

自己练习: PHP 在线编译器