开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第二阶段:抽象类 Abstract】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/712/detail/12698
抽象类 Abstract
内容介绍
一、学习目标
二、抽象类概念
三、步骤
四、示例
五、小结
一、学习目标
目标:理解抽象类的概念,掌握 abstract 关键字的作用和实际应用场景,理解大型项目架构的优缺点
二、抽象类概念
抽象类:使用 abstract 关键字修饰的类,表示该类只能被继承,不能被实例化。
抽象类只是用来规范下属类的基本结构,本身不可被实例化。
抽象类只能被实现类继承, abstract 关键字可以修饰方法,表示方法为抽象方法,抽象方法没有方法体(没有{})。
抽象方法存在的类必须为抽象类。
继承抽象类的类要么为抽象类,要么实现抽象类里所有的抽象方法。
抽象类还可以有其他类该有的任何成员。
三、步骤
1、项目较大,分组完成。
2、项目管理者为了确保各组开发的统一性,规范上层架构。
3、使用抽象类和抽象方法设定基调(多种抽象类)。规定操作的业务里面都必须用到统一的方法,可以保证其他人在调用抽象类时不用修改代码。一套方法, 只要调用不同的抽象类,就可以解决不同的产品的问题。
4、所有实现类都继承抽象类
四、示例
1、基本语法:使用 abstract 关键字修饰类
# 抽象类
abstracf class Human{}
2、抽象类无法被实例化
# 抽象类
abstract class Human{}
$h=new Human();
# 致命错误,抽象类不能被实例化
比如,代码:
#抽象类 abstract 寸
class Human{}
//这是一个普通类
#实例化
new Human();
//这个代码可以被实例化
代码:
#抽象类 abstract
#抽象类
abstract class Human{}
#不能被实例化
new Human();
//这是一个抽象类,代码不能被实例化
3、抽象类只能被继承(这是抽象类的一个特性)
# 抽象类(父类)
abstract class Human{}
# 子类
class Man extends Human{}
# 正确
代码:
#继承抽象类
class Man extends Human{}15
$m = new Man();
// 这个子类也是可以实例化
抽象类里面可以定义一些东西
4、abstract 关键字的修饰
abstract 关键字还可以用来修饰方法(抽象方法),abstract 修饰的方法不能有方法体,而且有抽象方法的类必须声明为抽象类
# 抽象方法抽象类
abstract class Human{
# 定义抽象方法:没有方法体
abstract public function eat():
public function show(){}
# 普通方法有方法体
}
说明有大括号就有方法体
代码:
#抽象类 abstract4
#抽象类
abstract class Human{8
#普通方法
public function show(){}
#抽象方法
public abstract function eat();
//有了{}不需要语句结束,但是此处不能有 body {},直接去掉{}则没有结束,所以此处应该再加一个;(分号)
}
#不能被实例化
# new Human();1819
#继承抽象类
class Man extends Human{}
$m=new Man();
此时这个代码依然不能运行,有两个办法,一个是必须把这个类改为抽象类,另一个是实现抽象方法。
(1)将上述代码改为抽象类:
abstract class Man extends Human{}
// 此处加上一个 abstract
# $m = npw Man();
// Man 一类也是抽象类,不能被实例化。
(2)实现抽象方法,代码:
abstract clas
s Woman extends Man{}
class Man extends Human{
#实现父类抽象方法
public function eat(){}
}
# $m = new Man();
抽象方法对应的类必须为抽象类,而抽象类要么被抽象类继承,要么是实体类继承,但是继承之后要实现抽象方法。
5、抽象方法因为要被子类继承实现,所以不能使用 private 修饰(私有方法不会被继承)
# 抽象类
abstract class Humanf
# 抽象方法
abstract private function eat));
# 错误:抽象方法不能私有化
}
比如代码:
private abstract function eat();
将 public 变为 private ,显示错误,因为抽象方法不能为 private 。
Protected abstract function eat();
将 public 变为 Protected 是可以的,因为父子类在实现的过程中本质就是重写这个方法,只是称为实现,本身没有方法比,不存在重写的概念。
若改为 private 显示错误,因为本质是继承了父类的方法,那就存在重写的嫌疑,而重写的嫌疑有一个要求就是子类不能比父类的控制权高,只能让它越开越开放,不能越来越保守。所以用 public 是可以的。
6、子类继承抽象类后,如果抽象类中有抽象方法,那么子类必须选择自己成为抽象类或者实现抽象方法(所有抽象方法)
#抽象方法抽象类(父类)
abstract class Humanf
# 定义抽象方法:没有方法体
abstract public function eat();
public function show(){}
# 普通方法有方法体
}
# 子类1:抽象类继承抽象类
abstract class Man extends Huma
n{}
# 正常继承
# 子类2:子类实现父类所有抽象方法
class Boy extends Man{
# 实现从祖父类维承的 eat 抽象方法
public function eat(){
echo 'eat';
}
}
抽象类的结构就是一种架构,顶层制定好之后,规定了基本的要实现的东西,用这种方式也可以提供具体的操作。做好之后,允许子类继承,如果架构足够庞大,子类可以再进行抽象化,再具体地增加对应的抽象功能。
五、小结
1使用 abstract 修饰的类叫做抽象类
2、抽象类不可以被实例化,只能被继承
3、因为抽象类无法被实例化,因此私有成员在类中没有实质意义(还需要额外提供受保护或者公有方法来实现访问)
4、抽象类的目的是用来规范子类(通常比配抽象方法),让子类继承抽象类,实现抽象类里面的抽象方法。
5、 abstract 还可以修饰方法,称之为抽象方法:抽象方法所在的类必须是抽象类,抽象方法不能有方法体
6、有抽象方法的抽象被继承时子类要么自身是抽象类,要么实现所有抽象方法
7、抽象类是一种结构管理,需要耗费较多的架构和初始代码,通常在比较大型或者规范的项目中才会使用。因为大型项目可能会从上往下逐层地架构规范,底层的代码只要用程序员去实现即可,实现上层架构提供的必须的一些规范,做好了可以方便用于别的团队/用户/开发者调用,但是保证有一套统一的规范。