回顾:员工层级结构
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 26 课,共 91 课。
挑战
简单让我们构建一个员工层级系统,把你在本章中学到的所有继承概念结合起来。你将创建一个抽象基类,定义每位员工都必须具备的内容,然后扩展该类,创建不同类型的员工,并让他们以不同方式计算奖金。
你将把代码分到 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 在线编译器