PHP中抽象类和接口的区别与例子

PHP中抽象类和接口区别:

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以用extends继承。abstract 关键字来定义个一个抽象类或者抽象方法。抽象类不能被实例化。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另JAVA接口中的成员变量都要声明为public static final类型).抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法和常量。
3、接口没有构造函数,抽象类可以有构造函数。(抽象类中可以有非抽象的方法,而接口中只能够有抽象的方法!)
4、抽象类只允许单继承,而接口可以多继承
5。在写法上 
 一、接口中的抽象方法前不用也不能加abstract关键字,默认隐式就是抽象方法,也不能加final关键字来防止抽象方法的继承.而抽象类中抽象方法前则必须加上abstract表示
  显示声明为抽象方法.
 二、接口中的抽象方法默认是public的,也只能是public的,不能用private、protected修饰符修饰.而抽象类则可以。
抽象类还是接口
如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建由一些不相关对象采用的功能,就使用接口。
如果必须从多个来源继承行为,就使用接口。
如果知道所有类都会共享一个公共的行为实现,就可以使用抽象类,并在其中实现该行为。

Explain:

abstract class Father {
    function meth1() {
        echo "meth1...<br>";
    }
    abstract function meth2();
    public $var1="var1";
    public static $var2="var2";
    const Var3="Var3";
}
class Son extends Father {
    function meth2() {
        echo "meth2 of Son...<br>";
    }
}
$s=new Son();
echo $s->var1."<br>";
echo Father::$var2."<br>";
echo Father::Var3."<br>";

Interface IFather {
    //public $iVar1="iVar1";         此处接口定义中不能包含成员变量
    //public static $iVar2="iVar2";  此处接口定义中不能包含静态变量
    const iVar3="iVar3";
    function iMeth1();
}
Class ISon implements IFather {
    function iMeth1() {
        echo "iMeth1...<br>";
    }
}
$is=new ISon();
echo IFather::iVar3;
//抽象类的定义:
abstract class ku{  //定义一个抽象类
  abstract function kx();
  ......
}
function aa extends ku{
  //实现抽象类的方法

  function kx(){
    echo
'sdsf';
  }
}
//使用方法
$aa=new aa;
$aa->kx();
//1.定义一些方法,子类必须完全实现这个抽象中所有的方法
//2.不能从抽象类创建对象,它的意义在于被扩展
//3.抽象类通常具有抽象方法,方法中没有大括号
//4.抽象方法不必实现具体的功能,由子类来完成
//5.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义
//6.抽象类的方法可以有参数,也可以为空
//7.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数
//////////////////////////////接口类的定义:
interface Shop{
      public function buy($gid);
      public function sell($gid);
      abstract function view($gid);
}
//如果要使用接口,必须定义接口类中的所以方法少一个都不可以(abstract除外)。
//这样如果在一个大项目中不管别人怎么去做下面的方法,但是他必须实现本接口中的所有方法才可以!
//例:实现上面的接口的一种方法
class BaseShop implements Shop{
    public function buy($gid){
  echo '你购买了ID为 :' . $gid . '的商品';
    }
    public function sell($gid){
  echo '你购卖ID为 :' . $gid . '的商品';
    }
    public function view($gid){
        echo '你浏览了ID为 :' . $gid . '的商品';
    }
}
//接口的多重继承示例:
interface staff_i1{ //接口1
  function setID();
  function getID();
}
interface staff_i2{ //接口2
  function setName();
  function getName();

class staff implements staff_i1,staff_i2{
  private $id;
  private $name;
  function setID($id){
  $this->id = $id;
 }
    function getID(){
  return $this->id;
    } 

    function setName($name){
  $this->name = $name;
    } 

    function getName(){
  return $this->name;
    } 

    function otherFunc(){ //这是一个接口中不存在的方法
  echo 'Test';
   }
}

总结

在学习PHP面向对象时,都会在抽象类与接口上迷惑,作用差不多为什么还那么容易混淆,何不留一去一?但是事实上两者的区别还是很大的,如果能够很好地运用PHP的两个方法,面向对象的程序设计将会更加合理、清晰高效。

对接口的使用方式是通过关键字implements来实现的,而对于抽象类的操作是使用类继承的关键字exotends实现的,使用时要特别注意。
接口没有数据成员,但是抽象类有数据成员,抽象类可以实现数据的封装。
接口没有构造函数,抽象类可以有构造函数。
接口中的方法都是public类型,而抽象类中的方法可以使用private、protected或public来修饰。
一个类可以同时实现多个接口,但是只能实现一个抽象类。
 
相同点:函数体内不能写任何东西,连两个大括号都不能写!!!如:function getName();这样就行了

时间: 2024-11-05 16:24:27

PHP中抽象类和接口的区别与例子的相关文章

PHP中抽象类、接口的区别与选择分析_php技巧

本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过关键字extends继承. 2.接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量.抽象类中可以声明各种类型成员变量,实现数据的封装.(另JAVA接口中的成员变量都要声明为public static final类型) <?php abstract class Father { funct

C#中抽象类和接口的区别

一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们. 二.接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1.不能实例化: 2.包含未实现的方法声明: 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括

Java中抽象类与接口的区别

  接口和抽象类有好多相同点和类似点,很多人有过这样的疑问:为什么有的地方必须使用接口而不是抽象类,而在另一些地方,又必须使用抽象类而不是接口呢?或者说,在考虑Java类的一般化问题时,很多人会在接口和抽象类之间犹豫不决,甚至随便选择一种. 理解抽象类 abstract class和interface在Java语言中都是用来进行抽象类(本文 中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法, 请读者

C++中抽象类和接口的区别介绍_C 语言

1. 如果一个类B在语法上继承(extend)了类A, 那么在语义上类B是一个类A.2. 如果一个类B在语法上实现了(implement)接口I, 那么类B遵从接口I制定的协议. 使用abstract class的根本原因在于, 人们希望通过这样的方式, 表现不同层次的抽象. 而interface的本质是一套协议. 在程序设计的发展中, 人们又发现接口可以用来表示对行为的抽象, 不过, 这只是interface的一种用法不是其本质. 理论结合实际才是最好的学习方式, 不过在这里, 我只想举一些我

php中抽象类和接口的概念以及区别

本篇文章是对php中抽象类和接口的概念以及区别进行了详细的分析介绍,需要的朋友参考下   复制代码 代码如下: //抽象类的定义: abstract class ku{ //定义一个抽象类 abstract function kx(); ...... } function aa extends ku{ //实现抽象类的方法 function kx(){ echo 'sdsf'; } } //使用方法 $aa=new aa; $aa->kx(); //1.定义一些方法,子类必须完全实现这个抽象中所

Java中抽象类和接口区别的个人见解

抽象类 抽象类是用来捕捉子类的通用特性的 .它不能被实例化,只能被用作子类的超类.抽象类是被用来创建继承层级里子类的模板.以JDK中的GenericServlet为例: public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {     // abstract method     abstract void service(ServletRequest req, ServletRe

java 抽象类与接口的区别介绍_java

抽象类与接口的区别 抽象类 包含抽象方法的类就是抽象类,声明的语句:abstract class 必须是public protected 接口 对行为的抽象,声明语句:interface 抽象方法的修饰符:public abstract 成员变量的修饰符:public static final 语法层面 抽象类中可以包含成员方法的实现细节,而接口中只能存在抽象方法-public abstract 抽象类中的成员变量可以是各种类型,接口中的成员变量只能是public static final 抽象

抽象类与接口的区别

接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的.接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final (这里需要说一点,既然一个变量被final修饰了,那么这个变量就是一个常量!!!!!变量必须初始化成常量!!!!!) 下面比较一下两者的语法区别: 1.抽象类可以有构造方法,接口中不能有构造方法. 2.抽象类中可以有普通成员变量,接口中没有普通成员变量!!!!!!!(注意重点在 普通 即

Java抽象类与接口的区别

很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. 抽象类 抽象类是用来捕捉子类的通用特性的 .它不能被实例化,只能被用作子类的超类.抽象类是被用来创建继承层级里子类的模板.以JDK中的GenericServlet为例: public abstract class GenericServlet implements Servlet, ServletC