# PHP学习(七) PHP抽象类与接口

# 抽象方法和抽象类

当类中有一个方法,但没有方法体,也就是没有花括号,直接分号结束,像这种方法我们叫抽象方法,必须使用关键字abstract定义。 包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。(即使用关键字abstract修饰的类为抽象类)。

// 抽象类
abstrace class{
    // 抽象方法,抽象方法不用写方法体。
    public abstract function fun();
}
1
2
3
4
5

# 抽象类的特点

  1. 不能实例化,也就是不能new成对象
  2. 若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。
  3. 含有抽象方法的类必须是抽象类
  4. 抽象类不一定非得含有抽象方法。
  5. 抽象类可以存在普通的方法
  6. 抽象类不能被实例化,必须由子类继承,并且把抽象类的抽象方法都实现。
<?php
// 1.含有抽象方法的类必须是抽象类
// 2.抽象类不一定非得含有抽象方法
// 3.抽象类可以存在普通的方法
// 4.抽象类不能被实例化 必须由一个子类继承 并且把抽象类的抽象方法都实现了
abstract class Person{
    //抽象方法没有方法体
    public abstract function eat();
}
class Man extends Person{
    public function eat() {
        echo "Man eat";
    }
}
$man = new Man();
$man -> eat();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 接口技术

PHP与大多数面向对象编程语言一样,不支持多重继承,也就是说每一个类只能继承一个父类。为了解决这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列函数。

定义格式:interface 接口名称{
    // 常量成员(使用const关键字定义)
    // 抽象方法(不需要使用abstract关键字)
}
使用格式:  class 类名 implements 接口1,接口2,{}
1
2
3
4
5

# 接口的特点

  1. 接口声明的关键字interface
  2. 接口可以声明常量,也可以抽象方法
  3. 接口中的方法都是抽象方法,不需要用abstract去定义。
  4. 接口不能被实例化,需要一个类来实例化。
  5. 一个类不能继承多个类,但是一个类可以实现多个接口

# 抽象类与接口的区别

# 官方版:

当关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

# 老袁说:

接口是对动作的抽象,表示这个对象能做什么,对类的局部行为进行抽象。

抽象类是对根源的抽象,表示这个类什么,对类的整体进行抽象,对一类事务的抽象描述。

# 翻译翻译:

比如:男人、女人,这两个类(如果是类的话.....),他们的抽象类是人(名词)。说明,他们都是人,人可以吃东西,狗可以吃东西,你可以把“吃东西”(动词)定义成一个接口,然后让这些类去实现它。所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口,走路接口)。

# 总结

  1. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
  2. 接口可以多继承,抽象类不行
  3. 接口定义方法,不能实现,而抽象类可以实现部分方法。
  4. 接口中基本数据类型为static 而抽象类不是
  5. 接口中不能含有静态代码块以及静态方法,而抽象类可以函数静态方法和静态代码块。
  6. 接口是纯粹的。

# 实例

<?php
// 1.接口声明的关键字是interface
// 2.接口可以声明常量也可以抽象方法
// 3.接口中的方法都是抽象方法 不用abstract去人肉的定义
// 4.一个类不能继承多个类 一个类可以实现多个接口
interface Person {
    const NAME = 'xiaowang';
    public function run();
    public function eat();
}
interface Study {
    public function study();
}
class Student implements Person, Study {
    const data = 3.14;
    public function run() {
        echo "run";
    }
    public function eat() {
        echo "eat";
    }
    public function study() {
        echo "study";
    }
    public function test() {
    	// 使用接口中的静态的常量。
        echo self::data;
    }
    // 静态方法
    public static function test1() {
        echo self::data;
    }
}

$xw = new Student;
$xw -> test();
// 使用接口中的静态方法。
$xw::test1();
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
更新时间: 11/8/2019, 4:51:43 PM