接口:
interface 在接口内定义方法,可不提供具体的代码实现
作用:提供一个规范,如果我们知道一个类实现了某个接口,那么就知道了可以调用该接口的那些方法,我们只需要知道这些就够了。
当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,我怎么知道他的某个功能的实现方法是怎么命名的呢,我们定义了一个接口类时,
它里面的方式是下面的子类必须实现的,
//声明一个shop接口类,定义了三个方法:买(buy),卖(sell),看(view) interface Shop { public function buy($gid); public function sell($gid); public function view($gid); }
实现给接口时,必须实现该接口的三个方法
class BaseShop implements Shop { public function buy($gid) { echo('你购买了ID为 :'.$gid.'的商品'); } public function sell($gid) { echo('你卖了ID为 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID为 :'.$gid.'的商品'); } }
$a=new BaseShop;
$a->buy(1);//执行buy方法
当我们在团队开发时,接口提供的规范,将提高我们的开发效率
抽象类
抽象类就把类像的部分抽出来,当你发现你的很多类里面用很多方法你不断的在重复写,那你就可以考虑使用抽象类了
注意:对于抽象类中的方法,子类不用全部实现,对于抽象方法,子类必须实现,若非抽象方法,之类可以重写覆盖
<?php abstract class BaseShop { public function buy($gid) { echo('你购买了ID为 :'.$gid.'的商品'); } public function sell($gid) { echo('你卖了ID为:'.$gid.' 的商品'); } abstract function view(); } class BallShop extends BaseShop { var $itme_id = null; public function __construct() { $this->itme_id = 2314; } public function open() { $this->buy($this->itme_id); } public function sell(){ echo "新的sell方法"; } function view(){ echo "实现抽象方法 "; } } $a=new BallShop; $a->open(); $a->sell(); $a->view(); ?> //结果:你购买了ID为 :2314的商品 新的sell方法 实现抽象方法
抽象类里实现了这些方法,那么继承它的子类就自动获得了这些方法,子类就做它自己独特的东西,介绍代码的重复,提高复用性。
接口和抽象类的区别:
- 对接口的使用方式是通过关键字implements来实现的,而对于抽象类的操作是使用类继承的关键字exotends实现的,使用时要特别注意。
- 接口没有数据成员,但是抽象类有数据成员,抽象类可以实现数据的封装。
- 接口没有构造函数,抽象类可以有构造函数。
- 接口中的方法都是public类型,而抽象类中的方法可以使用private、protected或public来修饰。
- 一个类可以同时实现多个接口,但是只能实现一个抽象类。
- 如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口。
- 如果必须从多个来源继承行为,就使用接口。
- 如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。