PHP抽象类和接口示例和区别

抽象类(abstract class)和接口(interface)是面向对象很重要的概念,他们很相似,都是定义要实现的方法,但又有不同的使用场景,PHP的抽象类和接口有什么区别,看下面的示例。

接口(Interface)—— 定义行为
抽象类(Abstract  Class) —— 实现行为
具体类(class)——执行行为

一.接口

接口定义了某种函数的规范,声明了所需的函数和常量,但是不能指定怎么实现。接口像是对具体类中方法的规范。

接口定义了发生某一行为需要的方法、方法名。然后允许具体的类来实现这些方法。。
注意:接口类不能定义类成员。定义的方法必须在实现的类中出现。

interface 接口名
{
function 方法1( );
function 方法2( );
}
//实现接口
class 类名 implements 接口名
{
 方法1( );
方法2( );
}

二.抽象类

抽象类是实例化的类,只能作为被其他类基层的基类。例如,可以写一个关于read的抽象类,然后电子阅读,纸质阅读来继承read抽象类。
abstract class 类名
{
各种方法
}

抽象类可以确保一致性,因为任何派生类都必须实现从该抽象类继承所有抽象方法,如果没有实现,那将产生错误。

应该用抽象类?还是 接口?
这是一个问题

** 如果要建一个类模型,这个模型将由一些紧密相关的对象采用,使用抽象类。如果模型将由不太相关的对象采用,用接口。
** 如果一个具体class将从多个来源继承行为,用接口。php类可以继承多个接口,但是不能继承多个抽象类。
** 如果所有的类都要共享一个公共的行为实现,用抽象类,并在其中实现该行为。。先用子类继承一个抽象类,继承后的子类能够实现原先的行为。。

摘: _______

事物的出现,总是有它出现的理由(需求)!
但是,事物的生存,需要有适应性(灵活)!
比如:长颈鹿,脖子长,这是个抽象的概念;
能吃草(是非肉食性动物的特征,接口)。

所以,当需要描述长颈鹿的时候,我们就可以用接口(非肉食性动物)和抽象(脖子长)的方法来定义它,
然后,具体是什么种类/或者颜色的长颈鹿,怎么个吃草法,这就是具体类了

PHP接口类

首先看接口,定一个接口类,interface class:

<?php
 
namespace frontend\models;
 
interface TestInterface
{
    public function cloud();
 
    public function sky();
 
    public static function color($color);
}

在PHP中,接口只能定义方法(或静态方法),但是不能实现具体的方法。在PhpStorm中如果写具体的方法会提示错误。接口比较严格的定义需要实现什么方法,只写要实现的方法就行了,不需要具体实现,或定义成员变量。

使用接口:

<?php
 
namespace frontend\models;
 
class Test implements TestInterface
{
    public function cloud()
    {
        echo 'Cloud....';
    }
 
    public function sky()
    {
 
    }
 
    public static function color($color){
 
    }
}
继承接口类,必须实现接口定义的每个方法,否则也会报错。这就是PHP的接口,严格定义实现哪些方法,并且必须在子类中都实现。

PHP抽象类

我们定义一个抽象类:

abstract class Testabstract
{
    public $abstract = 'abstract';
    abstract function hehe();
 
    public function hehe2()
    {
        echo 'hehe2';
    }
}

这里有两个方法,一个是用abstract修饰的,这样写表示该方法是子类必须实现的,而抽象类中只能定义不能具体实现。一个方法是普通的成员方法,而且有具体实现,子类也可以重写。

class ab extends Testabstract
{
    public function hehe()
    {
        echo 'hehe';
    }
}

子类继承抽象类,只需实现抽象类中定义的抽象方法。抽象类可以定义成员变量,而接口不行。

时间: 2024-08-31 06:28:53

PHP抽象类和接口示例和区别的相关文章

抽象类和接口联系与区别

关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意. 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于

Java抽象类与接口的区别

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

java 抽象类与接口的定义

java  抽象类与接口的定义 Jvm : 抽象规范: 一个具体实现 一个运行的虚拟机实例 装载器: 启动类装载器,自定义装载器(继承 java.lang.ClassLoader ) 解析的内型信息放入方法区,对象放入堆,一个新线程,有自己 java 栈放中间数据, pc 计数器. 接口与抽象类深入 java 没有多重继承,意味一个类只能继承一个父类所以绝对必要的时候,才用继承 所以表示相同行为的方法都应该声明为一个接口的的形式,并使用不同的实现类对其进行实现. 缺点:每一个实现类都需要显示的实

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

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

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

PHP中抽象类和接口区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以用extends继承.abstract 关键字来定义个一个抽象类或者抽象方法.抽象类不能被实例化. 2.接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量.抽象类中可以声明各种类型成员变量,实现数据的封装.(另JAVA接口中的成员变量都要声明为public static final类型).抽象类中可以有成员属性和成员方法,而接口中只能有未实现的方法和常

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

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

抽象类与接口的区别

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

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

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

用最简单的话概括 抽象类 和接口的区别?

问题描述 在网上看了些关于这方面的资料,感觉自己的理解还是不透确.我是这样理解的,从设计层次考虑:如果基类的方法在子类中都需要,则用抽象类定义.如果某些方法在某些子类中不需要,则这些方法应该定义在接口中.比如abstractclassdoor{close();open()}而Alarmdoor需要报警行为,但是可能其他门并不需要这个行为,所以可以将报警方法定义在一个接口中.interfaceArmdoor{alarm();}classAlarmdoor()extendsdoorimplentsA