再谈高级面向对象编程之接口

再谈高级面向对象编程之接口

和抽象类相似的是接口,接口,如抽象类一样,定义必须被特定类定义的功能接口,要创建接口,需要使用interface关键字,然后在大括号内,定义方法签名,而不是方法的真正实现。

Interface isomething{

       Public function somefunction($var);

}

作为一个惯例,接口名字经常以一个小写的i开始,但是这并不是必须的。

注意的是接口中的方法都是公开的(public)。同时,接口知识定义了方法,但是没有包括属性。

要将一个类和接口关联,需要在类 的定义中使用implements操作符:

Class someclass implementsiSomething{}

这个类然后必须定义接口中列出的所有方法,否则就会产生一个致命的错误。即:如果一个类中实现了一个接口,但是没有实现接口定义中的所有方法,就会产生致命的错误。

【知识拓展】抽象类和接口

一个接口和抽象类之间的区别很微妙,一个抽象类意味着会被扩展为一个特定的类,我们将使用扩展类来创建一个对象实例。正如我们看到的那样,一个抽象类需要定义一个一般的对象。

相反的,一个接口不能被一个类继承,所以我们不能认为一个接口就是定义一个完整的对象的松散方式,取而代之,一个接口建立一个类需要有方法的合约,而不去关心类的类型。

在抽象类和接口之间还有一个区分方式,那就是抽象类和他的继承类之间还有一种‘是一个’的关系。接口和他的继承类之间没有这种关系,尽管我们可以说继承类和接口之间有一个‘有相同行为’的关系。

【示例】使用接口

1.     声明iCrub接口

Interface iCrub{

Public function create($data);

Public function read();

Public function update($data);

Public function delete();

}

iCrub接口定义了四个必要的方法,其中两个方法需要接收参数。

接口中所有的方法的可见性都是公开的。这是必须的。

2.     开始定义User类:

Class User implements iCrub{

       Private $_userId = Null;

       Private $_username = NULL;

}

User 类实现了接口iCrub,这意味着在User类中必须定义接口iCrub中所有的四个方法。

3.     定义构造函数

Function _ _construct($data){

       $this -> _userId = uniqid();

        $this->_username= $data[‘username’];

}

构造函数将会接受一个数组作为参数,它将会使用这个值赋给类内部的私有变量。

这个构造函数将会调用PHP uniqid() 函数创建一个唯一的用户ID。

在真实的应用中,构造函数可能需要在数据库中创建一条用户的记录,并且将自动生成的主键值赋给内部属性。

4.     定义create()函数

Function create($data){

        Self::__construct($data);

}

为了实现iCrub接口,这个类必须创建一个带有单独的参数的create()方法。然而构造函数已经做了创建这个类型的对象所需要的东西,因此这个方法只要调用构造函数就可以了(使用关键字self,他将指向当前的类,和范围解析符一起使用)并且带上提供的数据。

这个方法将会用在当一个新的user对象被创建的情形下,然后重用以创建一条新的记录。

5.     定义read()方法:

Function read(){

Return array(‘userId’=>$this ->_userId,’username’ => $this->_uesrname);

}

Read()函数没有任何参数,返回值为一个数组信息。在这个虚构的示例程序中,这个信息使用内部变量来表示。在一个真实的应用程序中,read()方法可能需要从数据库中获得相关的信息,使用内部的、私有的ID值来决定获取哪条记录。

6.     定义update()方法:
function update($data){

$this->_username = $data[‘username’];

}

用户的ID值可能不被更新,因此update()方法被定义为只更新一个单独的内部属性。

7.     定义delete()方法

Public function delete(){

        $this->_username = null;

        $this->_userId = NULL;

}

Delete方法会清除属性的值。在一个真实的示例中,这个函数可能要在数据库中删除相应的记录。

提示:

接口是有很多含义的单词。一般来说,接口指使用UML图表表示的类和方法的这类信息。换句话说,一个接口解释了一个类或者方法是如何被使用的。另外,接口可以指一个类需要绑定的合约。相对于抽象类和继承来说,使用接口的另一个好处就是,PHP的类不能从多个父类继承。然而,类可以从多个接口来实现,使用逗号分隔。

Instanceof 操作 符也可以被用于测试是否一个类实现了一个接口。

Class someclass implements iA,iB{}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值