再谈高级面向对象编程之接口
和抽象类相似的是接口,接口,如抽象类一样,定义必须被特定类定义的功能接口,要创建接口,需要使用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{}