header-bg.jpg
PHP面向对象之抽象类(abstract)与接口(interface)
发表于 2018-01-05 09:25
|
分类于 PHP
|
评论次数 0
|
阅读次数 1543

attachment/2018/01/05/54721515112290.jpg

一 名词解释

抽象类&抽象方法abstract):具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,通过extends来实现,抽象类中也可以定义普通方法。

接口interface):接口是一组成员声明方法的集合,包含空的成员方法和常量,空的方法要求继承类去具体实现。成员方法为public,属性为常量。继承是一级一级层次式,如果某一层出现问题,整个继承就会出现意外。而接口只影响实现接口的类,接口可以在破坏原来的继承基础上对类扩展。接口可以实现多继承。抽象类及普通类都可以实现接口,通过关键字implements

二 Example

###abstrct

?
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
abstract class Foo{
    /*
     * 如果需要限制子类的方法名,那么可以定义一个抽象类
     * 如果一个类中含有抽象方法 那么该类必须是一个抽象类 即用abstract修饰
     * 抽象方法不含有代码体 因为子类覆盖该方法 所以不需要代码体
     */
    abstract public function bar();
  
    //抽象类中可以含有普通方法
    public function foos(){
        echo '普通方法已执行';
    }
}
  
class Foo2 extends Foo{
    public function bar(){
        echo 'bar方法已执行';
    }
}
  
class Foo3 extends Foo{
    public function bar(){
        echo 'bar方法又执行了';
    }
}
(new Foo2())->bar();    //output: 'bar方法已执行'
(new Foo2())->foos();   //output: '普通方法已执行'
(new Foo3())->bar();    //output: 'bar方法又执行了'

###interface

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
40
41
42
43
44
45
46
47
48
//接口通过interface声明
interface Model{
    //接口中定义的方法可以接收参数
    public function query($sql);
}
  
interface Db{
    //连接方式
    public function connect();
    //执行方式
    public function exec();
}
  
//一个类可以实现多个接口,通过implements继承
class DbPdo implements Db,Model{
    public function connect(){
        echo 'Pdo连接方式';
    }
  
    public function exec()
    {
        echo 'Pdo执行方式';
    }
  
    //必须和接口中的方法保持一致
    public function query($sql){
        echo '查询语句:' . $sql;
    }
}
  
class DbMysqli implements Db{
    public function connect()
    {
        echo 'Mysqli连接方式';
    }
  
    public function exec(){
        echo 'Mysqli执行方式';
    }
}
  
$pdo = new DbPdo();
$pdo->connect();    //output: 'Pdo连接方式'
$pdo->exec();   //output: 'Pdo执行方式'
$pdo->query('select * from db');    //output: '查询语句:select * from db'
$mysqli = new DbMysqli();
$mysqli->connect();    //output: 'Mysqli连接方式'
$mysqli->exec();    //output: 'Mysqli执行方式'

三 abstract与interface的区别

1 接口只能用implements实现 抽象类用extends继承实现

2 接口没有数据成员,只能定义常量,抽象类则可以有数据成员

3 接口方法只能用public来修饰 抽象类方法可以用protected private public来修饰

4 接口中不可以有普通方法,抽象类可以有普通方法

5 一个类可以实现多个接口,但只能继承一个抽象类

发布评论
还没有评论,快来抢沙发吧!