# PHP学习(七) PHP抽象类与接口
# 抽象方法和抽象类
当类中有一个方法,但没有方法体,也就是没有花括号,直接分号结束,像这种方法我们叫抽象方法,必须使用关键字abstract定义。 包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。(即使用关键字abstract修饰的类为抽象类)。
// 抽象类
abstrace class{
// 抽象方法,抽象方法不用写方法体。
public abstract function fun();
}
1
2
3
4
5
2
3
4
5
# 抽象类的特点
- 不能实例化,也就是不能new成对象
- 若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。
- 含有抽象方法的类必须是抽象类
- 抽象类不一定非得含有抽象方法。
- 抽象类可以存在普通的方法
- 抽象类不能被实例化,必须由子类继承,并且把抽象类的抽象方法都实现。
<?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
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
2
3
4
5
# 接口的特点
- 接口声明的关键字interface
- 接口可以声明常量,也可以抽象方法
- 接口中的方法都是抽象方法,不需要用abstract去定义。
- 接口不能被实例化,需要一个类来实例化。
- 一个类不能继承多个类,但是一个类可以实现多个接口
# 抽象类与接口的区别
# 官方版:
当关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
# 老袁说:
接口是对动作的抽象,表示这个对象能做什么,对类的局部行为进行抽象。
抽象类是对根源的抽象,表示这个类什么,对类的整体进行抽象,对一类事务的抽象描述。
# 翻译翻译:
比如:男人、女人,这两个类(如果是类的话.....),他们的抽象类是人(名词)。说明,他们都是人,人可以吃东西,狗可以吃东西,你可以把“吃东西”(动词)定义成一个接口,然后让这些类去实现它。所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口,走路接口)。
# 总结
- 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
- 接口可以多继承,抽象类不行
- 接口定义方法,不能实现,而抽象类可以实现部分方法。
- 接口中基本数据类型为static 而抽象类不是
- 接口中不能含有静态代码块以及静态方法,而抽象类可以函数静态方法和静态代码块。
- 接口是纯粹的。
# 实例
<?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
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