类的继承与抽象类以及接口的学习
1 实例演示继承的三大功能
- 类的继承也是类的扩展,扩展父类的功能
- 子类有权访问父类的 public 和 protected
- 功能:继承,重写,扩展
1.1 继承
- 使用 extends 相当于复制了父类中的公共和受保护的属性和方法
<?php
//类继承
class Nicola
{
public $name = '尼古拉';
protected $sex = '男';
private $money = '500万';
public function write()
{
// 1.创建类实例
$nicola = new Nicola;
//2.访问类中的属性
return "姓名: {$nicola->name}";
}
}
class Son extends Nicola
{
//继承
//父类的公共和受保护成员会自动成为子类的成员
//使用extends相当于复制了父类中的公共和受保护的属性和方法
public $name = '尼古拉';
protected $sex = '男';
public function write()
{
// 1.创建类实例
$nicola = new Nicola;
//2.访问类中的属性
return "姓名: {$nicola->name}";
}
}
1.2 重写
- 属性重写,重新赋值
- 方法重写,实际上就是实现方法级的多态
//重写
// 重写与父类重名的属性
protected $sex = '女';
// 方法重写,实际上就是实现方法级的多态
public function write()
{
// 1.创建类实例
$nicola = new Nicola;
// 在子类中可以引用父类的成员
//2.访问类中的属性
return "姓名: {$nicola->name},性别:{$nicola->sex},是一个大帅哥";
}
1.3 扩展
- 在父类基础上添加新的功能
- 扩展新的属性
- 扩展新的方法
//扩展
// 在父类基础上添加新的功能
protected $profession = '搬砖工/Boss';
public function write2()
{
return "职业: {$this->profession}";
}
2. 实例演示抽象类的作用与实现
- 抽象类,方法不能被实例化
- 部分分离了设计(抽象类)与实现(工作类)
- 抽象类也可以被继承,也可以用在继承上下文环境中
- 抽象类允许有抽象成员,但不是强制的(例如保护当前这个类,不希望客户端直接实例化使用)
实现类/工作类(不一定是普通类)
工作类是一个可以被实例化的普通类,第一步就是实现抽象类的抽象方法
<?php
//抽象类
//部分分离了设计(抽象类)与实现(工作类)
abstract class Nicola
{
public $name = '尼古拉';
protected $sex = '男';
private $money = '500万';
public function write()
{
return "姓名: {$this->name},性别:{$this->sex}";
}
//抽象方法:没有方法体
abstract protected function write2();
}
//实现类/工作类(不一定是普通类)
//工作累是一个可以被实例化的普通类
//第一步就是实现抽象类的抽象方法
//抽象类也可以被继承,也可以用在继承上下文环境中
//抽象类允许有抽象成员,但不是强制的
abstract class Son extends Nicola
{
protected $profession = '搬运工/boss';
protected function write2()
{
return "{$this->profession}";
}
}
class Sun extends Son
{
public function write2()
{
return "{$this->profession}";
}
}
// 客户端
//抽象方法不能被实例化
// $son = new Son;
// echo $son->write2();
$sun = new Sun;
echo $sun->write2();
3. 实例演示接口的基本语法
- 接口:完全分离了设计与实现
- 语法:interface
- 实现接口的功能:implements
- 默认访问控制或者是 public
使用与类相似的语法:抽象方法,常量,构造方法(魔术方法的一种)
<?php
//接口:完全分离了设计与实现
//语法:interface
//使用与类相似的语法:抽象方法,常量,构造方法(魔术方法的一种)
//默认访问控制或者是public
//接口允许多继承,从而间接实现了php的多继承
// 实现接口的功能:implements
// 单接口
interface iNicola
{
//接口常量
const NATION = '中国梅州';
//接口方法:默认就是抽象方法
public static function write();
// 构造方法
}
class Nicola implements iNicola
{
protected static $name = '尼古拉特斯拉';
//接口中的抽象方法,必须在工作类中实现
public static function write()
{
return self::$name . '家乡是:' . iNicola::NATION;
}
}
echo iNicola::NATION;
echo Nicola::write();
总结
本节课学习了类的继承和抽象类的作用和功能,介绍了接口的基本语法和功能。类的继承实际上就是功能上的扩展和延申,把基础的通用的内容作为一个基类/父类,扩展类/子类延申扩展新的需求和功能,就好像 html 的公共部分一样,css 的公共样式一样。
抽象类中的抽象方法并不能实例化,因此必须要有工作类/实现类继承并且实现抽象类中的抽象方法。
接口是一个实现 php 多继承的功能,间接的实现了 php 的多继承功能。