xml地图|网站地图|网站标签 [设为首页] [加入收藏]
php抽象类与接口的区别详解
分类:网络频道

PHP中抽象类和接口区别:

区别:

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

  1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
  2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。(另JAVA接口中的成员变量都要声明为public static final类型)
  3、接口没有构造函数,抽象类可以有构造函数。

Explain:

  4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
  5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

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;
    } 

<?php
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>";

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

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

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

如果更详细一点我们可以对每一个都介绍一下

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

抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。

总结

接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。

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

抽象类与接口的相同点:

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

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

本文由宝马娱乐在线发布于网络频道,转载请注明出处:php抽象类与接口的区别详解

上一篇:【宝马娱乐在线网址】php操作xml类读取查询删除 下一篇:常用PHP封装分页工具类介绍
猜你喜欢
热门排行
精彩图文