1. 抽象类
抽象类,即abstract class,介绍抽象类之前先介绍抽象方法。
类中的没有方法体的方法就是抽象方法,一般会用关键字 abstract 定义抽象方法。
抽象方法的一般格式为:
abstract 可见性 function 方法名称(参数1,.....);
抽象类中既可以包含抽象方法,也可以包含普通方法;抽象类不一定有抽象方法;有抽象方法的类一定是抽象类。
抽象类的一般格式为:
abstract class 类名{
属性;
抽象方法;
普通方法;
}
下面定义一个抽象类:
<?php
abstract class AbstractClass
{
// 定义两个抽象方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 定义一个普通方法
public function printOut() {
print $this->getValue() . "\n";
}
}
?>
关于抽象类的几点说明:
- 抽象类不能实例化,只能被继承(extends)。
- 抽象方法的可见性不能是私有的(private)。
- 父类的抽象方法必须在子类中重写。
- 抽象方法只需声明必填参数,在子类中重写时,可声明可选参数。
2. 接口
接口是抽象类的变体,接口中所有的方法都是抽象方法(没有方法体),接口中除了可以包含方法外,还可以包含常量。
这里的接口是狭义的,广义的接口是任何一个可以对外提供服务的出口,如:提供数据传输的USB接口、支付宝开放平台的接口、微信公众平台的开放API等。下面我们要说的接口都是狭义的 interface 接口。
一般用关键字 interface 定义接口。
接口定义了一套规范,它描述了一个“物”的基本功能。如果一个类(class)实现(implements)了某个接口(interface),我们便知道这个类实现了什么功能。
接口本身并不提供实现,只是提供了一个规范。
在PHP中,接口的语义是有限的,使用接口的地方并不多,PHP中的接口可以淡化为设计文档,起到一个团队开发基本契约的作用。
下面定义一个缓存接口:
<?php
/**
* 缓存处理接口(项目经理定义接口,技术人员实现接口)
*
**/
interface Cache {
const MAX_KEY = 10000; // 最大缓存量
public function set($key, $value); // 写入缓存
public function get($key); // 读取缓存
public function del($key); // 删除某个缓存
public function flush(); // 清空缓存
}
?>
关于接口的几点说明:
- 接口中的所有方法必须是抽象方法,且可见性必须是public
- 一个类一旦实现( implements)了某个接口,就必须实现接口中的所有方法。
- 接口与接口之间也可以继承( extends),且接口的继承是多继承,也就是说一个子接口可以继承多个父接口,中间用逗号隔开.
- 一个类也可以实现(implements)多个接口,中间用逗号隔开