抽象类和接口

PHP / 108人浏览 / 0人评论

在开发的过程中或者在面试的过程中,总是会遇到这个问题,在自己的印象中还是比较模糊的,今天简单的写两条,这个网上也有很多,都大同小异。


## 抽象类 ##


   在声明类时有一个方法时抽象方法,那么这个类就是抽象类,抽象类要使用abstract关键字来修饰。

   在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

   


    <?php

        abstract class Person{

            protected $name;

            protected $country;

     

            function __construct($name="",$country="china"){

                $this ->name = $name;

                $this ->country = $country;

            }

     

            abstract function say();

            abstract function eat();

     

            function run(){

                echo "使用两条腿走路<br>";

            }

        }

    ?>


   抽象类就像是一个“半成品”的类,在抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。

   当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。



## 接口 ##


   接口中声明的方法必须都是抽象方法,另外不能再接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。


   使用extends关键字让一个接口去继承另一个接口,实现接口之间的扩展。


   通过类去继承接口时需要使用implements关键字来实现,而并不是使用extends关键字完成。


   如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

       <?php

          interface 接口名称{ //使用interface关键字声明接口

          常量成员 //接口中的成员属性只能是常量,不能是变量

          抽象方法 //接口中的所有方法必须是抽象方法,不能有非抽象的方法存在

          }

       ?>


    <?php

    interface one{

    const CONSTANT = 'CONSTANT value';

    function fun1();

    function fun2();

    }

     

    //声明一个抽象类去实现接口One中的第二个方法

    abstract class Three implements One{ //只实现接口中的一个抽象方法

    function fun2(){

    //具体的实现内容由子类自己决定

    }

    }

     

    //声明一个类实现接口One中的全部抽象方法

    class Four implements One{

    function fun1(){

    //具体的实现内容由子类自己决定

    }

     

    function fun2(){

    //具体的实现内容由子类自己决定

    }

    }

     

    ?>


## 总结 ##

   1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。

   2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。

   3、接口没有构造函数,抽象类可以有构造函数。

   4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用protected,public来修饰。

   5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

0 条评论

还没有人发表评论

发表评论 取消回复