PHP中的Abstract Class和Interface

最近开始学习PHP+MySQL,记录下学习过程中的重点内容吧,然后考虑把开发网站的过程也写一个系列Blog。

这篇blog主要介绍了Abstract ClassInterface的区别。

Abstract Class

什么是Abstract Class( 抽象类)

和C++中的抽象类概念一样,包含有纯虚函数(Java和Php中叫abstract method)的类叫做Abstract Class。 我们有时候也把abstract Class叫做base class,因为base class不能直接生成对象。

PHP 中的abstract Class

我们来看代码:

abstract class abc
{
public function xyz()
{
return 1;
}
}
$a = new abc();//this will throw error in php

PHP中的abstract class和其他oop语言一样,我们用关键字 abstract 来声明一个抽象类,如果你想直接生成这个类的对象,会报错。

abstract class testParent
{
public function abc()
{
//body of your funciton
}
}
class testChild extends testParent
{
public function xyz()
{
//body of your function
}
}
$a = new testChild();

testChild通过关键字extends 继承了抽象类 testParent, 然后我们就可以生成 一个testChild的对象了。
实现Abstract Method

类似于C++中的纯虚函数,我们只能在抽象类中申明Abstract method,而只能而且必须在子类中定义它。

其实这种说法不是绝对的,但是为了方便记忆,大多说的教材这样说,来我们回顾一下Effective C++中的关于pure virtual函数的讲解。

“Pure Virtual函数必须在derived class中重新声明,但是它们也可以有自己的实现”

class Airplane{
public:
    virtual void fly(const Airport& destination) = 0;
    ....
};

void Airplane::fly(const Airport& destination){
    // 缺省行为,将飞机飞到指定的目的地
}
class ModelA: public Airplane{
public:
    virtual void fly(const Airport& destination)
    {Airplane::fly(destination);}
    ....
};

class ModelB: public Airplane{
public:
    virtual void fly(const Airport& destination);
    ....
};
void ModelB:: fly(const Airport& destination){
    // 将C型飞机飞到指定的地方
}

实际上,我们在derived class ModelA中对virtual method做了一个inline调用

想在的fly被分割为两个基本要素:

其声明部分表现的是接口(这个derived class必须使用的)

其定义部分则变现出缺省行为(那是derived class可能使用的,但只有在它们明确提出申请时才是)

以上内容摘自《Effective C++改善程序与设计的55个具体做法 》条款34: 区分接口继承和实现继承

让我们回来继续讨论PHP中的abstract method的实现。

abstract class abc
{
abstract protected function f1($a , $b);
}
class xyz extends abc
{
protected function f1($name , $address)
{
echo $name , $address;
}
}
$a = new xyz();

在abc中,我们用关键字abstract 声明了一个abstract method f1。在PHP中

一旦你在abstract class中声明了一个abstract method,那么所有继承这个class的subclass都必须要去declare这个method,否则,php会报错。

abstract class parentTest
{
abstract protected function f1();
abstract public function f2();
//abstract private function f3(); //this will trhow error
}
class childTest
{
public function f1()
{
//body of your function
}
public function f2()
{
//body of your function
}
protected function f3()
{
//body of your function
}
}
$a = new childTest();

上面的代码中可以看到,申明一个private的abstract method将会报错,因为private method只能在当前的类中使用。

注意到在abstract class中 f1函数是protected,但是在subclass中我们可以将其声明为public的。no any visibility is less restricted than public.

Interface

Interface in oop enforce definition of some set of method in the class。

interface将会强迫用户去实现一些method。例如有一个class中必须要求set ID和Name这两个属性,那么我们就可以把这个class申明为interface,这样所有继承自这个class的derived class都将强制必须实现setId和setName两个操作

Interface in php

Interface abc
{
public function xyz($b);
}

和其他oop语言一样,我们用关键字Interface 来声明。

在这个interface里面我们声明了一个method xyz,则任何时候,subclass中都必须申明这样的一个method xyz

class test implements abc
{
public function xyz($b)
{
//your function body
}
}

你可以用关键字 implements 来继承自interface。

在interface中,只能使用public,而不能使用诸如protected和private

interface template1
{
public function f1();
}
interface template2 extends template1
{
public function f2();
}
class abc implements template2
{
public function f1()
{
//Your function body
}
public function f2()
{
//your function body
}
}

你可以用extends关键字来继承interface,好像class那样。

这里的template2将包含所有template1的属性,因此在implements自template2的class abc,将必须实现 function f1和f2,

你还可以extends multiple interface:

interface template1
{
public function f1();
}
interface template2
{
public function f2();
}
interface template3 extends template1, template2
{
public function f3();
}
class test implements template3
{
public function f1()
{
//your function body
}
public function f2()
{
//your function body
}
public function f3()
{
//your function body
}
}

同时,你的class也可以implements多个interface

interface template1
{
public function f1();
}
interface template2
{
public function f2();
}
class test implments template1, template2
{
public function f1()
{
//your function body
}
public function f2()
{
//your function body
}
}

但是如果两个interface包含同样名字的method,那么你的class将不能同时implement他们。

继承自interface中的method必须有同样的参数规范,例如下面的代码是可行的:

interface template1
{
public function f1($a)
}
class test implements template1
{
public function f1($a)
{
echo $a;
}
}

但是这样的代码将会出错:

interface template1
{
public function f1($a)
}
class test implements template1
{
public function f1()
{
echo $a;
}
}

但是,我们不需要把两个method里面的参数命名为同样的名称,下面的代码是可行的:

interface template1
{
public function f1($a)
}
class test implements template1
{
public function f1($name)
{
echo $name;
}
}

同时,如果使用default value,你还可以改变参数的default value,下面的代码是可行的:

interface template1
{
public function f1($a = 20)
}
class test implements template1
{
public function f1($name  = ankur)
{
echo $name;
}
}

Abstract Class和Interface之间的不同:

1. In abstract classes this is not necessary that every method should be abstract. But in interface every method is abstract.

在Abstract class中并非所有的method都必须是抽象的,但是在interface中所有的method都自动成为抽象的。就是在子类中必须声明和实现

2. Multiple and multilevel both type of inheritance is possible in interface. But single and multilevel inheritance is possible in abstract classes.

multiple和multilevel inheritance,我不知道改怎么翻译更好,multiple inheritance意思是 在interface中,一个class可以同时implements好多个interface;但是在abstract classes中,只能extends一个class。

当然你extends的这个class可能又extentds别的class,这就是所谓的multilevel inheritance。

3. Method of php interface must be public only. Method in abstract class in php could be public or protected both.

interface中的method必须是public的,但是在abstract class中可以是public或者protected。

4. In abstract class you can define as well as declare methods. But in interface you can only defined your methods.

在abstract class中你可以同时声明(declare)和定义(define)methodes,但是在interface中你只能定义那个methods

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, function
, interface
, public
, abstract
, method
, abstract 
, bstract和interface
abstract关键字
php abstract class、php class interface、abstract interface、abstract和interface、abstract class,以便于您获取更多的相关知识。

时间: 2024-09-14 04:18:11

PHP中的Abstract Class和Interface的相关文章

[C#]中abstract类和interface概念和区别讲解

  abstract(抽象)类和interface(接口)是面向对象编程中两个概念,但是学了很多年编程的程序员有时对这两个概念的区分仍然不是很清楚.下面就讲解abstract类和interface的概念和区别. abstract(抽象)类 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法. 抽象类不能被实例化. 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类. 具体派生类必须覆盖基类的抽象方法. 抽象派生类可以覆盖基类的抽象方法,也可以不

java中abstract class和interface学习笔记

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

走出abstract class与interface的困惑

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

编程-关于‘abstract class和interface有什么区别’这个问题的一些疑问?

问题描述 关于'abstract class和interface有什么区别'这个问题的一些疑问? 1.抽象类里面可以用普通方法,而接口中的方法全部都是抽象的: 2.抽象类中可以有非 public static final修饰的属性,接口中的属性都是public static final修饰的 3.抽象类有构造方法,接口没有构造方法 4.抽象类中可以有静态方法,接口中不能有静态方法 5.类与抽象类的关系是继承,而且是单继承.类与接口的关系是实现,而且是多实现. 6.抽象类由abstract cla

C#中的abstract与virtual

abstract abstract 修饰符可以和类.方法.属性.索引器及事件一起使用. 在类声明中使用 abstract 修饰符以指示类只能是其他类的基类. 抽象类具有以下特性: ·抽象类不能实例化. ·抽象类可以包含抽象方法和抽象访问器. ·不能用 sealed 修饰符修改抽象类,这意味着该类不能被继承. ·从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现. ·在方法或属性声明中使用 abstract 修饰符以指示此方法或属性不包含实现. 抽象方法具有以下特性: ·抽象方法

java接口-java中api即application program interface和interface有和区别和联系

问题描述 java中api即application program interface和interface有和区别和联系 java中api即application program interface和interface有和区别和联系 应用程序接口和接口有什么区别和联系 解决方案 api说的是你的系统提供给别的系统调用的方式和约定,是一个比较大的概念. interface说的是java语法上的接口.是一个比较小的概念.

abstract class和interface有什么区别

声明方法的存在而不去实现它的类被叫做抽象类( abstract class ),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建 abstract 类的实例.然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例.不能有抽象构造函数或抽象静态方法. Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为.取而代之,在子类中实现该方法.知道其行为的其它类可以在类中实现这些方法   接口( interface 

java与c#的区别、两者有什么不同?_其它相关

Java 的设计者是因为讨厌C++的复杂,于是Java 非常简洁,GC 也让内存管理非常方便,C# 是看中了Java 的GC,和虚拟机技术,希望把微软的几大语言集成到.NET 上来. 因此C#从语言上来讲并不简单甚至可以算的上复杂. 两种语言的设计思路也不一样,Java 是编译解释语言,C#是编译然后编译运行语言.Java 没有委托,C# 有委托.Java 倾向于用Interface 实现委托的功能,而 在C# 中,Abstract Class 比Interface 发挥了更大功能. Java

abstract class && Interface 比较

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