好吧,使用您的 Car 对象,我将尝试通过一个真实世界的示例来解释这个概念。
想象一下,您是一家制造汽车零件的小公司 (A),您为一家大公司 (B) 制造汽车零件,而这些公司是您的客户,这些零件将被其他汽车制造商使用。
B 公司必须确保您的产品符合标准,并且与所有汽车制造商兼容。
这是你的界面。
接口用于定义一些标准化的方法或属性,以我们为例,我们可以定义一个零件在每个角落有4个孔,用于固定在另一家公司制造的另一个零件上。
抽象有点不同,抽象比接口更具体(我同意这是一种废话),但它们是具体的,因为它们直接实现(例如接口)一个功能,而抽象类可以永远被实例化。
抽象类主要用于定义一些基本或共享的功能以使其 DRY。
因此,您可以创建一个扩展抽象类并实现接口的类。
这是一个例子:
interface Vehicle {
protected $engine;
protected $wheels;
public function startUp();
public function stop();
}
您的 Vehicle 接口定义了需要有引擎和车轮(任意数量)的 Vehicle。
abstract class Car implements Vehicle {
protected $wheels = 4;
public function startUp() {
$this->engine->startUp();
}
public function stop() {
$this->engine->stop();
}
}
因为startUp() 和stop() 只是Engine 对象的代理,我们可以将它们放在抽象类中,以便在所有扩展类中重用。
我们将 Car 类设置为有 4 个轮子。
class Renault extends Car {
protected $color = 'yellow';
}
这里我们只需要扩展 Car 抽象类,我们添加一些颜色,因为它很酷。
现在,假设我们要将雷诺带到洗车站,因为我们正在实现一个已知接口,洗车站将能够在不知道我们的车辆是雷诺的情况下工作,但只是知道它是一辆车。
这是一个非常基本的示例,它可以设计得更好,但它应该向您展示它是如何工作的。
不需要接口,至少 PHP 不需要任何类来实现任何接口,但是,你应该使用它们,这通常是一个很好的做法,它在编写 API 时会帮助你,单元测试或在其他开发人员之间共享一些代码。