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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php面向对象之抽象类和接口理解相关的知识,希望对你有一定的参考价值。

结合网上文档和官方文档,自我测试总结心得,实践出真知,时间匆忙,写的不详请谅解!

结合实例分析:

<?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

以上是关于php面向对象之抽象类和接口理解的主要内容,如果未能解决你的问题,请参考以下文章

php面向对象-修饰符和抽象类和接口

PHP 面向对象程序设计(oop)学习笔记 - 抽象类对象接口instanceof 和契约式编程

PHP面向对象之接口

代码学习PHP面向对象之抽象类与接口

php 抽象类和接口的区别

php面向对象 封装继承多态 接口重载抽象类最终类总结