温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php面向对象之抽象类和接口理解

发布时间:2020-06-02 23:16:49 来源:网络 阅读:889 作者:明成51xit 栏目:web开发
结合网上文档和官方文档,自我测试总结心得,实践出真知,时间匆忙,写的不详请谅解!

结合实例分析:

<?php

   header("Content-type:text/html;charset=utf-8");

   abstract class People{

        protected $age=22;

        public $height=1.70;

        abstract function work();

        //抽象方法没有方法体,子类必须实现。

        function run(){}

        function People() //可以定义构造函数

        {

        echo "人类的平均身高".$this->height."<br/>";

        }

    }

    abstract class student extends People{ 

    //如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类

        abstract function student_run(){}

    }

    class PhpTeacher extends student implements Common{

    public $height=1.75;

    //子类的属性访问控制必须和父类一样甚至更宽泛

    /*function PhpTeacher()

        {

        echo "php程序员的平均身高".$this->height."<br/>";

        }*/

        function work(){  //抽象方法子类必须实现

            echo "教授php";

        }

        function getAge()

        {

        echo $this->age;//继承父类可以访问父类的age

        }

        // function run(){

        //     echo "会跑步";

        // }

        function speakEnglish(){

        echo "会说英语"."<br/>";

        }

       function drive($height)

        {

              echo $height."<br/>";

        }

    }


    interface Common{

    //所有的接口方法,实现接口的类必须都得实现

       function speakEnglish();  

       //interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 不能加abstract

       function drive($args);

    }

    $phpTeacher = new PhpTeacher();

    $phpTeacher ->work();

    echo "<br/>";

    $phpTeacher->getAge();

 /*

总结:

抽象类

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

抽象类的特点:

抽象类不能实例化,只能被继承。

抽象类不一定有抽象方法,有抽象方法的类,一定是抽象类。

抽象方法的可见性不能是private

抽象方法在子类中,需要重写。

什么时候需要用抽象类?

有个方法,方法体不知如何写,子类中还必须有这个方法时,封装成抽象方法,类为抽象类。

控制子类中必须封装某些方法时,可以用抽象方法。

当需要控制类只能被继承,不能被实例化时。


接口 

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。接口中定义的所有方法都必须是公有,这是接口的特性。

接口的继承(extends):

接口继承接口   interface 接口名称 extends 父接口名称

注意:类的继承是单继承(只能有一个父类),但接口的继承却是多继承,类对接口的实现也是多实现。

接口的实现(implements):

类实现接口      class 类名 implements 接口名称1,接口名称2, ...

继承类同时实现接口:

类继承父类同时实现接口    class 类名 extends 父类名 implements 接口名称


抽象类和接口的区别

接口是一种特殊的抽象类,接口中只包含抽象方法,没有成员属性。

类实现(implements)接口时,必须完全实现接口中的所有方法;类继承(extends)抽象类时,只需对需要用到的抽象方法进行重写。

抽象类只能单继承,但接口却是多继承,类对接口的实现也是多实现。

  */

?>

参考链接:
http://php.net/manual/zh/language.oop5.abstract.php
http://php.net/manual/zh/language.oop5.interfaces.php
http://www.jb51.net/article/47485.htm
http://blog.csdn.net/lamp_yang_3533/article/details/50830214
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI