有时使用对象的工作可能很艰难,尤其是当您不知道需要使用哪种结构时。
例如,抽象类和界面都可以迫使其他类实现某些方法。
界面是“合同”
实现接口的类必须实现其方法。
例如,您可以确保旨在记录数据具有适当方法和行为的类。
这样,您可以安全地使用代码中的某些方法,因为类实现了定义所需行为的接口。
一词“合同”是否是描述接口的最佳词是另一个辩论。
这里的问题是要知道何时应该使用接口而不是抽象类,反之亦然。
仅方法签名?
接口和抽象类都可以包含使用它们的类必须实现的方法签名。
interface LoggingInterface
{
public function warning($message, array $context = array()): void;
}
abstract class Logging
{
abstract public function warning($message, array $context = array()): void;
}
这两个结构都不能实例化,必须实现(接口)或扩展(抽象类)。但是,接口不能具有属性和功能(〜与身体的方法)。
那有什么区别?
PHP类可以实现多个接口,但是不可能扩展多个类。
IMHO,这是了解何时应该使用接口或抽象类的关键。
如果您需要将一些功能(而不是抽象)和属性传递给一组类,则抽象类可能是有益的。如果您只想确保您的课程将实现特定的行为,请使用接口。
在上面的示例中,接口似乎更合适,这不仅是确保将使用特定签名实现warning()
方法。
使用两个结构来改进您的代码
无论您使用接口还是抽象类,通常比经典延伸或大开关案例更好。
代码也应该更可读,因为您可以切割大量的if
条件并防止不必要的重复。
当然,仍然可以编写不良代码,但是这些结构可以帮助您找到自己的路。
接口和抽象类非常相似,但是抽象类就像可以提供默认实现的对象的基本代码,因此扩展它们的类通常是相关的。
相比之下,接口专注于行为,可以分组无关的类。