本文作者:心月

php抽象类和接口知识点整理

心月IT博客 2019-11-12
php抽象类和接口知识点整理摘要:抽象类和接口相似,都是比较特殊的类。抽象类是特殊一种类,而接口是一种特殊的抽象类。想要理解抽象类先要理解抽象方法。

        抽象类和接口相似,都是比较特殊的类。抽象类是特殊一种类,而接口是一种特殊的抽象类。想要理解抽象类先要理解抽象方法,在面向对象的编程语言中,一个类可以很多子类,而每一个类中至少有一个公共方法作为外部访问的它(父类)的接口,为了方便类之前继承就引入了抽象方法。


一、什么是抽象方法?

        抽象方法是没有方法体的方法,没有方法体是指方法声明时没有花括号以及其中的内容,而是声明方法时直接在方法名后加上分号结束,声明抽象方法要使用abstract关键字修饰。声明抽象方法格式:

abstract function();


二、什么是php抽象类?

        只要声明抽象方法的类就是抽象类,抽象类也要使用abstract关键字修饰,抽象类中可以有不是抽象方法的方法和成员属性,但访问权限不能是私有(private关键字修饰的)。下面是个简单的抽象类的声明,在抽象类person声明方法foot()和抽象方法say(),定义三个成员属性。

简单的说:

1.如果一个类中有一个方法是抽象的方法,这个类就是抽象类。

2.如果声明一个抽象类,则这个类必须要使用abstract 关键字来修饰。

例如:

abstract class Person{
  public $name;
  abstract function say();
  abstract function eat();
}

【注意】

①只要使用abstract 来修饰的类,就是抽象类。

②抽象类是一个特殊的类,特殊在哪里(在抽象类中可以有抽象方法)。

③除了在抽象类中可以有抽象方法以外,和正常的类完全一样。

④抽象类不能实例化对象(不能创建出对象)。

$p=new Person(); //报错

⑤如果看见抽象类,就必须写这个类的子类,将抽象类中的抽象方法覆盖(加上方法体)。

class student extend Person()
{
     function say(){  // 只覆盖了父类的一个
    }
}

⑥子类必须全部实现(覆盖重写)抽象方法,这个子类才能创建对象,如果实现部分,那么还有抽象方法,他还是抽象类。

class student extend Person()
{
     function say(){  // 只覆盖了父类的一个
    }
}

抽象方法作用

抽象方法就是一个规定,规定子类必须有这个方法的实现,功能交给子类实现。

只写出来结构,没有实现,实现交给具体的子类(按自己功能实现)。

简单的说:抽象类就是一个规范


接口 (接口是一种特殊抽象类,接口也是一种特殊的类 )

1、接口和抽象类的相同点

①抽象类和接口都有抽象方法。

②抽象类和接口不能创建实例对象。

③抽象类和接口使用意义相同。定义一种规范。

2、不同点

①接口中的方法必须全要是抽象方法(不能用不抽象的方法),所以在接口的所有方法中不使用abstract,直接使用 分号结束。

②接口中的成员属性,必须是常量(不能有变量)。

③接口所有权限必须是公有的 public

④声明接口 不使用class 使用 interface ,

interface Person{
    public $name; //不能声明变量 报错
    const NAME='tom'// 可以声明常量
    function test();  //因为接口中全部是抽象方法 所以 省去 abstract 。
    function test1();
    Protect function test3() 报错 只可以是 public
}
$re=new Person; //报错 不可以 创建实例化 对象 。
echo Person:: NAME; 输出常量。

3、接口应用的一些细节

①可以使用 extends,让一个接口继承另一个接口(接口和接口的关系---只有扩展抽象方法,没有覆盖关系)。

②可以使用一个类,来实现接口中的全部方法,也可也使用一个抽象类,来实现接口的部分方法。(类与接口  或者 抽象类 与接口,有覆盖的关系,---重写---实现接口中的抽象方法)

interface Demo{
    const NAME='tom';
    public function test();
    public function test1();
}

interface test extends Demo{ //接口对接口 只有扩展
    function test2();
}

③只要在子类中有覆盖的动作,就不要使用extends(继承 扩展)这个关键字,使用implements 实现。

interface Demo{
  const NAME='tom';
 public function test();
 public function test1();
}
interface test extends Demo{ //接口对接口 只有扩展
 function test2();
}
class Hello extends test{} // 报错 // 类对接口 有覆盖
abstract class Hello implements test{
} //不报错

④一个类可以在继承另一个类的同时,使用implements 实现接口(可以实现多个接口)(一定要先继承,在实现接口)。

interface Demo{
    const NAME='tom';
    public function test();
    public function test1();
}

interface test extends Demo{ //接口对接口 只有扩展
    function test2();
}

Class Word{
    Function test5(){
    }
}

class Hello extends Word implements test{
    //可以使用接口
    function test(){
    }
    
    function test1(){
    }
    
    //实现接口
    function test2(){
    }
    
    //function test5(){
    }
}

⑤实现多个接口,只需使用逗号分开即可。

php 中一个类 只最多只能有一个父类 。

interface Demo{
  const NAME='tom';
 function test1();
}

interface Test extends Demo{
 function test2();
}

class World{
     function test3();
}

interface Abc{
function test6{}
}

class Hello extends World implements Test,Abc{
     function test1(){
    }
    
     function test2(){
    echo 11;
    }
    
     function test3(){
    }
    
     function test6(){
    }
    
}

$re=new Hello;
$re->test2(); //输出 11
文章版权及转载声明:

本文由 心月IT技术博客 博主整理于 2019-11-12
若转载请注明原文及出处:https://www.xinyueseo.com/other/494.html

分享到:
赞(
发表评论
快捷输入:

验证码

    评论列表 (有 0 条评论,人围观)参与讨论