再简单地说明一次
接口就像一个协议。它不指定对象的具体行为,而是指定你的代码如何告诉该对象如何行动。接口就像英语:定义一个接口定义了你的代码如何与实现该接口的任何对象通信。
接口始终是一种协议或承诺。当一个类说 "我实现接口 Y",它就表示 "我承诺拥有与具有接口 Y 的任何对象相同的公共方法"。
另一方面,抽象类就像一个部分构建的类。它就像一份空白的文档。它可能使用英语,但并不像文档中已经写好的部分那样重要。
抽象类是另一个对象的基石。当一个类说 "我扩展抽象类 Y",它就表示 "我在这个名为 Y 的其他类中使用了一些已经定义的方法或属性"。
因此,请考虑以下 PHP 代码
<?php
class X implements Y { } // 这表示 "X" 同意用你的代码说 "Y" 语言。
class X extends Y { } // 这表示 "X" 将完成部分类 "Y"。
?>
如果你要分发一个供其他人使用的类,你应该让你的类实现特定接口。接口是拥有类特定公共方法集的协议。
如果你(或其他人)编写了一个已经包含一些你想要在你的新类中使用的方法的类,你应该让你的类扩展抽象类。
这些概念虽然容易混淆,但它们是截然不同且独立的。就所有意图和目的而言,如果你只是你自己的类的唯一用户,你不需要实现接口。