PHP面向对象之抽象类详解(代码实例)
本文目标:
1、了解PHP中抽象类的定义
2、了解PHP中抽象类的作用
3、了解PHP中抽象类的使用场景
4、掌握PHP中抽象类的具体实现
还是按照之前一贯的思路,我们通过3W1H的方式进行学习,那么首先我们来了解一下
(一)、了解PHP中抽象类的定义(What)
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。通常在编程语句中用 abstract 修饰的类是抽象类。
和接口的不同之处在于,接口中的方法都是不实现的,只是单纯的定义,但是抽象类中的方法是可以实现的。
(二)、了解PHP中抽象类的作用(Why)
在PHP中的类当中,有很多类会被不断的重写,这个时候我们可以使用抽象类,怎么做呢?就是先写一个公共的类,然后实例化之后我们可以重复去调用。这样可以提高代码的可重用性
(三)、了解PHP中抽象类的使用场景(Where)
1、如果发现代码中很多类都有相似或者共同的方法,我们可以把这些相同或者相似的方法抽离出来,封装到抽象类中。
抽象类和接口有点相似,可以这么说,接口是一个特殊的抽象类,只不过接口里面全都是抽象的方法,(所谓抽象就是没有具体的实现),但是抽象类中的部分方法,是可以具备实现的功能,
(四)、掌握PHP中抽象类的具体实现(How)
总结:
1、抽象类的定义通过abstract 定义,比如abstract class 类名{}
2、抽象类的方法的定义也是通过abstract定义,比如abstract public function 方法名(){}
3、抽象类是不能被实例化的
4、要继承一个抽象类,通过关键字extends
5、抽象类的子类必须要实现抽象类中未实现的所有方法,也就是说要重写抽象类中所有abstract的方法
6、抽象类的子类虽然没有实现抽象类中的已经实现的方法,一样可以调用这些方法,其实结合继承我们可以很好理解这点
每个总结都是通过实践得出来的,现在我们用实践来演示总结,这样可以促进理解,让每个总结理解起来更加清晰,直观
(五)、具体代码
案例一、
实践目标:
1、抽象类的定义通过abstract 定义,比如abstract class 类名{}
2、抽象类的方法的定义也是通过abstract定义,比如abstract public function 方法名(){}
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "呼吸<br/>";
- }
- }
- ?>
案例二、
实践目标:
1、抽象类是不能被实例化的
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "呼吸<br/>";
- }
- }
- $animal = new Animal();
- ?>
运行结果为:
Fatal error: Uncaught Error: Cannot instantiate abstract class Animal in D:\E-class\class-code\classing\index.php:10 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 10
案例四、
实践目标:
1、要继承一个抽象类,通过关键字extends
2、抽象类的子类必须要实现抽象类中未实现的所有方法,也就是说要重写抽象类中所有abstract的方法
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "呼吸<br/>";
- }
- }
- //定义猴子
- class Monkey extends Animal{
- }
- ?>
如果Monkey类继承了抽象类,但不实现里面的abstract方法,那么运行结果为:
Fatal error: Class Monkey contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Animal::eat) in D:\E-class\class-code\classing\index.php on line 13
接下来我们来实现abstract方法
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "呼吸<br/>";
- }
- }
- //定义猴子
- class Monkey extends Animal{
- //实现抽象类中的抽象方法
- public function eat(){
- echo "我是猴子类中的eat方法<br/>";
- }
- }
- $monkey = new Monkey();
- $monkey->eat();
- ?>
运行结果如下:
我是猴子类中的eat方法
案例五、
实践目标:
1、抽象类的子类虽然没有实现抽象类中的已经实现的方法,一样可以调用这些方法,其实结合继承我们可以很好理解这点
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "抽象类中的呼吸方法<br/>";
- }
- }
- //定义猴子
- class Monkey extends Animal{
- //实现抽象类中的抽象方法
- public function eat(){
- echo "我是猴子类中的eat<br/>";
- }
- }
- $monkey = new Monkey();
- $monkey->eat();
- $monkey->breath();
- ?>
运行结果如下:
我是猴子类中的eat
抽象类中的呼吸方法
(六)、学以致用
问题:将以下真实场景,用抽象类还原出来
小芳放学回到家中,一进家门,只见心爱的小狗“小爱”马上就对主人摇起了尾巴,小芳笑了笑,走过去,抱起了小狗,最后,小芳和小狗亲了一口
思路分析:
1、对象分析:学生,小狗
2、对象属性分析:结合(现实世界+具体场景)
学生:名称
狗:名称
3、对象方法分析:结合(现实世界+具体场景)
学生:
(1)、放学
(2)、回到家中
(3)、走路
(4)、看
(5)、笑
(6)、抱东西
(7)、亲嘴
狗:
(1)、看
(2)、摇尾巴
(3)、亲嘴
4、我们发现这2个对象都有相似的方法,看,亲嘴,所以我们可以把它们封装到抽象类中,并且这2个方法不需要子类去重写,因为都是一样的
具体代码如下:
- <?php
- abstract class Animal{
- abstract public function eat();//抽象方法
- //呼吸
- public function breath(){
- //所有动物的呼吸方法都是一样的,就不需要使用多态了
- echo "抽象类中的呼吸方法<br/>";
- }
- }
- //定义猴子
- class Monkey extends Animal{
- //实现抽象类中的抽象方法
- public function eat(){
- echo "我是猴子类中的eat<br/>";
- }
- }
- $monkey = new Monkey();
- $monkey->eat();
- $monkey->breath();
- ?>
运行结果为:
小芳放学了
小芳回到家中
看见了小爱
小爱摇了尾巴
小芳微笑了
小芳走了过去
小芳抱起了小爱
小芳亲了小爱一口
小爱亲了小芳一口
(七)、总结
1、本文主要讲解了PHP中抽象类的定义,作用以及具体的实现。