2、什么是父类、子类

在Class类中,我们可以实现类似于生孩子这样的特性。
例如下图:
image.png
Class中的父子类关系生成主要分成三种模式:

  1. 1、继承
  2. 2、接口
  3. 3、抽象

每一种模式之间,都有各自不同的要求和特点,我们在下面的课件中会对其进行一一讲解。

3、类的继承

继承是面向对象程序设计中最常用的一个特性,
假设案例中的汽车是一个比较大的类,我们也可以称之为基类或父类,
除此之外,汽车还分为卡车、轿车、SUV、越野车等,
因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用性,同时也方便程序管理和升级。
PHP 使用 extends 关键字来继承一个类,,其语法格式如下:

  1. class 本类名(子类) extends 继承的类名(父类) {}

下面,我们使用魔兽争霸3的游戏兵种,来进行一个Class继承的学习:

  1. 1、假设兵种是一个大类(父类)
  2. 2、那么所有兵种同有的属性肯定有:血量、攻击力、防御值。
  3. 3、所有兵种同有的方法肯定有:发起攻击
  4. 4、子类的工作应该是生产不同的兵种。

那么则可以使用继承的特性,编写以下代码:

  1. <?php
  2. # 我是基类,定义一个兵种模糊的概念
  3. class Arms {
  4. protected $Name; // 兵种名称
  5. protected $HP; // 血量
  6. protected $AD; // 攻击力
  7. protected $MD; // 防御力
  8. # 调用这个方法攻击
  9. public function Battle() {
  10. $this->HP = $this->HP - $this->AD;
  11. echo $this->Name.'受到攻击剩余血量为:'.$this->HP.'<br/>';
  12. }
  13. }
  14. # 我是子类,实体化一个步兵兵种
  15. class Infantry extends Arms {
  16. # 初始化兵种属性
  17. public function __construct() {
  18. # 修改父类定义的成员属性
  19. $this->Name = '步兵'; // 兵种名称
  20. $this->HP = 120; // 血量
  21. $this->AD = 2; // 攻击力
  22. $this->MD = 5; // 防御力
  23. }
  24. }
  25. # 我是子类,实体化一个远程兵种
  26. class Remote extends Arms {
  27. # 初始化兵种属性
  28. public function __construct() {
  29. # 修改父类定义的成员属性
  30. $this->Name = '远程兵'; // 兵种名称
  31. $this->HP = 80; // 血量
  32. $this->AD = 10; // 攻击力
  33. $this->MD = 1; // 防御力
  34. }
  35. }
  36. # 生产出一个步兵
  37. $Infantry = new Infantry();
  38. $Infantry->Battle();
  39. # 生产出一个远程兵
  40. $Infantry = new Remote();
  41. $Infantry->Battle();