# 接口 1。现在实中的接口, 不同的种类,但是有相同的能力。 家里耗子多。 买一只狗,或狗都可以,都可以让他们去干这个活。 用哪个看个人喜欢。 ![](https://img.kancloud.cn/07/73/0773c58b59b7aaef32496fd33f6cd82a_500x500.png) 2。程序 ``` <pre class="calibre7">``` //发送接口 interface send { //实现这个接口的类,必须实现,接口定义的方法 public function send($str); } // implements 表示 实现发送接口 class Sms implements send { public $to = '13912345678'; public function send($str) { var_dump("{$this->to}, $str"); } } class Email implements send { public $to = '12345678@qq.com'; public function send($str) { var_dump("{$this->to}, $str"); } } class Order { public $notice; public function __construct($notice) { $this->notice = $notice; } public function delivery() { $this->notice->send('发现订单未支付,但是发货了'); } } $order = new Order(new Sms()); $order->delivery(); $order = new Order(new Email()); $order->delivery(); ``` ``` 输出: 13912345678, 发现订单未支付,但是发货了 [12345678@qq.com](#!), 发现订单未支付,但是发货了 - - - - - - 3。疑问,不一定要用接口啊, Sms 跟 Email 实现 send方法就可以接比如这样。程序一样正常运行。 ``` <pre class="calibre7">``` class Sms { public $to = '13912345678'; public function send($str) { var_dump("{$this->to}, $str"); } } class Email { public $to = '12345678@qq.com'; public function send($str) { var_dump("{$this->to}, $str"); } } ``` ``` 3。但是如果 Order 强制了接口,那么Sms 跟 Email 就必须实现 接口,不然会报错 ``` <pre class="calibre7">``` class Order { public $notice; //参数为 send $notice ,表示 $notice 必须实现了 send接口,不然程序报错 public function __construct(send $notice) { $this->notice = $notice; } public function delivery() { $this->notice->send('发现订单未支付,但是发货了'); } } ``` ``` 4。那问题来了,写程序的时候,不强制要求就可以啦 。分析有两种情况吧。 - - - - - - 一、项目主管比较严谨,分配下面的人分别 实现Sms ,跟 Email功能,必须实现这个接口。 - - - - - - 二、PHP一些内置的功能也要实现相应的接口,比如:foreach 是遍历数组 的,如果对象,也要可以被 foreach遍历,那么对象就必须实现 Iterator 接口。