PHP接口的实现(转)(笔记)

接口定义了实现某种服务的一般规范,声明了所需的函数和常量,但不指定如何实现。之所以不给出实现的细节,是因为不同的实体可能需要用不同的方式来实现公共的方法定义。关键是要建立必须实现的一组一般原则,只有满足了这些原则才能说实现了这个接口。

接口中不定义类成员!类成员的定义完全交给实现类来完成。

先来看一个简单的例子,有个全面的认识:

<?php
interface Fruit
{
    const MAX_WEIGHT = 5;   //此处不用声明,就是一个静态常量
    function setName($name);
    function getName();
}
//实现接口
class Apple implements Fruit
{
    private $name;
    function getName() {
        return $this->name;
    }
    function setName($_name) {
        $this->name = $_name;
    }
}

$apple = new Apple(); //创建对象
$apple->setName("苹果");
echo "创建了一个" . $apple->getName();
echo "<br />";
echo "MAX_GRADE is " . Apple::MAX_WEIGHT;   //静态常量
?>

  

拿侵占公司财物作为例子。这可以用很多方式来完成,取决于是谁来做这种不光彩的事情。例如,一名普通员工可能使用办公室信用卡购买鞋子和电影票,然后在购买单据上写上“办公用品”,而一名主管可能让他的助手通过在线账户系统向他的瑞士银行户头汇款。这两种员工都能完成这个任务,但方式不一样。在这种情况下,接口的目标就是定义侵占公司的一组原则,然后要求各个类分别实现这个接口。例如,接口可能只包括两个方法:

emptyBankAccount()
burnDocuments()

然后可以要求Employee和Executive类实现这些特性。在本节中,我们将学习到这些内容。不过,首先要花点时间理解PHP5是如何实现接口。在PHP中,要这样创建接口:

interface IinterfaceName
{
	CONST 1;
	...
	CONST N;
	function methodName1();
	...
	function methodNameN();
}

  

通常,在接口名前面加上字母I来进行标识,以便更容易辨认。

当类通过implements关键字实现了接口后,就完成了一个契约。接口中的所有方法都必须实现,倘若实现类没有实现所有的方法,则必须声明为抽象类,否则将出现下面所示的致命错误:

Fatal error: Class aaa contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (IinterfaceName::methodNameN) in D:\www\test.php on line 11

  

以下是实现上述接口的一般语法:

class aaa implements IinterfaceName{
    function methodName1(){
        echo "fda";
     }

     function methodNameN(){
          echo "methodNameN";
     }
}

实现一个接口

下面给出PHP接口实现的一个实际例子,在此创建并实现了一个名为IPillage的接口,IPillage接口如下:

interface IPillage
{
    function emptyBakAccount();
     function burnDocument();
}

然后通过Executive类实现此接口:

class Executive extends Employee implements IPillage
{
	private $totalStockOptions;
  	function emptyBankAccount()
  	{
     	echo "Call CFO and ask to transfer funds to Swiss bank account.";
  	}
  	function burnDocuments()
  	{
     	echo "Torch the office suite.";
  	}
}

  

因为公司中所有级别的人都能进行侵占,所以可以有Assistant类实现此接口:

class Assistant extends Employee implements IPillage
{
	function takeMome()
	{
		echo "Taking memo...";
	}
  	function emptyBankAccount()
  	{
      	echo "Go on shopping spree with office credit card.";
  	}
  	function burnDocuments()
  	{
      	echo "Start small fire in the trash can.";
  	}
}

  

的名字,但接口允许不同的类,以不同的方式来实现这些方法。在这个例子中,对于烧文件的方法,Assistdnt类只是把文件在垃圾筒里烧掉,而Executive类则通过更过分的方式来做到(将它的办公室烧掉)。

实现多个接口

如果我们允许外来承包商侵占公司是不公平的,毕竟公司是在所有全职员工的努力之下建立的。就是说,怎样为员工提供工作和侵占公司的功能,而限制承包商只能完成所需的任务呢?解决的办法是将这些任务分成几项任务,然后实现必要的多个接口。PHPS 支持这个特性。考虑如下例子:

<?php
interface IEmployee{...}
interface IDeveloper{...}
interface IPillage{...}
class Employee implements IEmployee,IDeveloper,iPillage {
    ...
}
class Contractor implements IEmployee,IDeveloper {
    ...
}
?>

可以看到,员工类可以实现所有3个接口,而承包商类只能实现IEmployee和IDeveloper。

时间: 2024-08-09 22:52:43

PHP接口的实现(转)(笔记)的相关文章

接口(学习中笔记)

接口可以包含方法.属性.事件和索引器,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口本身不提供它所定义的成员的实现.接口只指定实现该接口的类或接口必须提供的成员. interface IMyExample {  string this[int index]{get;set;}  event EventHandler Even;  void Find(int value);  string Point{get;set;} } public delegate void

Java中抽象类和接口的区别(读书笔记)

Java的抽象类和接口 抽象类和接口是两个容易混淆的概念,但有一句话能很好地将这两者区分开来,即抽象类是事物的抽象,而接口是行为的抽象.抽象类抽象出来的是一类事物,事物中包含了一些固有的属性和行为,而接口更多的是提供固有属性行为之外的延伸行为.打个比方,可以把动物看成为抽象类,类中有一些固有属性,如身高体重,还有一些共有行为,如吃饭和睡觉,所有的动物都遵循着这些属性和行为.除此之外,有些动物还能飞,但并不是所有的动物都具有飞行这种能力,此时飞行只是事物的延伸功能,相当于一个接口. 一.抽象类 抽

C# 接口开发小工具 笔记

做了2年的接口开发,主要给移动端提供接口,整理了一套小工具,在这里记录一下. 1.非空字段检测 接口某些字段不能为空,最开始进行空值检测是在方法里面,一个参数一个参数手动的检测是否为空,某些方法非空字段十几个的时候,代码臃肿,看着恶心,写着也烦,于是就利用特性和反射实现了自动空值检测. //特性声明 [AttributeUsage(AttributeTargets.Property)] public class NotNull : Attribute { } //使用方式 public clas

C语言接口与实现学习笔记——链表

实现一个链表的一系列接口,体会了指针的用法 list.h #ifndef LIST_INCLUDE #define LIST_INCLUDE #define T List_T typedef struct T *T; struct T { T rest; void *first; }; extern T List_append(T list, T tail); extern T List_copy(T list); extern T List_list(void *x, ...); extern

ajax抓取网站接口图片瀑布流笔记

用php结合ajax来实现去其它网站抓取图片,在自己本地用! ajax代码部分 <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>图片瀑布流</title> </head> <style>     body{         margin:0;     }    #u

sc7731 Android 5.1 Camera 学习之二 framework 到 HAL接口整理

前面已经分析过,Client端发起远程调用,而实际完成处理任务的,是Server端的 CameraClient 实例.远程client 和 server是两个不同的进程,它们使用binder作为通信工具,完成进程间的通信. 注:CameraClient定义如下: 1 class CameraClient : public CameraService::Client 2 { 3 //... 4 }; App需要对Camera进行各种操作,framework-java 和framework-c++

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这

UNP学习笔记(第十七章 ioctl操作)

ioctl相当于一个杂物箱,它一直作为那些不适合归入其他精细定义类别的特性的系统接口. 本章笔记先放着,到时候有需要再看 ioctl函数 #include <unistd.h> int ioctl(int fd,int request,.../* void *arg */); 其中第三个参数总是一个指针,但指针的类型依赖于request参数. 我们可以把网络相关的请求(request)划分为6类: 1.套接字操作 2.文件操作 3.接口操作 4.ARP高速缓存操作 5.路由表操作 6.流系统

Spring Mvc笔记

Spring Mvc工作流程与模块功能 Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示: 工作流程 (1)收到一个 HTTP 请求后, DispatcherServlet 根据HandlerMapping来选择并且调用适当的控制器 . (2)控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法.Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中.