PHP面向对象(五)

一、抽象方法和抽象类
  在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口。而抽象方法就是为了方便继承而引入的。

  抽象方法:当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束,象这种方法我们叫抽象方法,必须使用关键字abstract定义
    例如:public abstract function fun();
  抽象类:包含抽象方法的类必须是抽象类也要使用关键字abstract加以声明。(即使用关键字abstract 修饰的类为抽象类
  抽象类的特点:
    不能实例化,也就new成对象
    若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。

  其实抽象类对于子类(实现类),有一个约束的作用。子类继承一个抽象父类必须实现父类中的所有抽象方法(除非它也是一个抽象类)
    注意:含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。

 1 <?php
 2     //抽象类父类A
 3     abstract class A
 4     {
 5         public function fun1()        
 6         {
 7             echo "fun1()...<br/>";
 8         }
 9         
10         public function fun2()        
11         {
12             echo "fun2()...<br/>";
13         }
14         
15         public abstract function fun3();    
16         
17         /**
18          *求和方法
19          * @param int $a 被求和参数1
20          * @param int $b 被求和参数2
21          * @return int 返回求和结果
22          */
23         public abstract function add($a,$b);    
24         
25     }
26 
27     class B extends A
28     {
29        public function fun3()        
30         {
31             echo "fun3()...<br/>";
32         }
33 
34        public function add($x,$y)    //这就是约束:函数名必须是add,参数必须有两个
35        {
36            return $x+$y;
37        }
38     }
39 
40     $b = new B();
41     $b->fun1();
42     $b->fun2();
43     $b->fun3();
44     echo $b->add(10,20);
45 ?>

二、接口
  PHP与大多数面向对象编程语言一样,不支持多重继承,也就是说每个类只能继承一个父类。为了解决这个这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列函数。
  接口:如果在一个抽象类中包含的只有抽象方法,可以将其定义为interface(接口),用implements(实现)关键字使用它。
  定义格式
    interface 接口名称
    {
      //常量成员 (使用const关键字定义)
      //抽象方法 (不需要使用abstract关键字)
    }
  使用格式: class 类名 implements 接口名1,接口名2{ ... ... }

  当一个类在实现了一个接口后,它必须实现即覆盖该接口的所有方法才可以实例化使用,否则即为抽象类。

 1 <?php
 2     //接口
 3     interface A
 4     {
 5         public function fun1();
 6         
 7         public function fun2();
 8         
 9         public function fun3();
10         
11     }
12 
13     //定义了类B实现接口A
14     abstract class B implements A
15     {
16        public function fun1()
17        {
18             echo "fun1()...<br/>";
19        }
20        public function fun2()
21        {
22             echo "fun2()...<br/>";
23        }
24        
25     }
26     class C extends B
27     {
28        public function fun3()
29        {
30             echo "fun3()...<br/>";
31        }
32     }
33 
34     $b = new C();
35     $b->fun1();
36     $b->fun2();
37     $b->fun3();
38 ?>

三、抽象类与接口的区别
  定义:
    抽象类表示该类中可能已经有一些方法的具体定义。
    接口就仅仅只能定义各个方法的界面,不能有具体的实现代码在成员方法中。
  用法:
    抽象类是子类用来继承的,当父类已有实际功能的方法时,该方法在子类中可以不必实现。
    实现一个接口,必须实现接口中所有定义的方法,不能遗漏任何一个。
  理解: 接口就像公司老板(每年定下一系列目标,不去做,只提出各种计划)
      抽象类就像公司各层级经理(配合老板定下的计划,实现一部分,分发一部分任务员工)
        最终继承的类就是普通员工(接收经理分发的任务,按照要求,毫不遗漏的完成)
四、多态
  对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。
  为什么要多态?
    多态可以使程序可扩展性更强,减少代码更改量。
  实现多态的方法:继承(重写)、抽象、接口
  例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。

 1 <?php
 2     //多态
 3     //主板上的PCI插槽接口
 4     abstract class PCI
 5     {
 6         public abstract function start();
 7         public abstract function stop();
 8     }
 9 
10     //主板类
11     class MainBoard
12     {
13         public function running(PCI $pci)
14         {
15             $pci->start();
16             $pci->stop();
17         }
18     }
19 
20     //声卡厂家
21     class SoundCard extends PCI
22     {
23         public function start()
24         {
25             echo "声卡启动...<br/>";
26         }
27         
28         public function stop()
29         {
30             echo "声卡停止...<br/>";
31         }
32     }
33 
34     //网卡厂家
35     class NetWorkCard extends PCI
36     {
37         public function start()
38         {
39             echo "网卡启动...<br/>";
40         }
41         
42         public function stop()
43         {
44             echo "网卡停止...<br/>";
45         }
46     }
47 
48 
49     //使用:主程序
50     $mb = new MainBoard();
51     $sc = new SoundCard();
52     $nc = new NetworkCard();
53 
54     $mb->running($sc);
55     $mb->running($nc);
56 ?>
原文地址:https://www.cnblogs.com/yexiang520/p/5665246.html