强制子类覆盖PHP中的特定函数


Force child classes to override a particular function in PHP

我正在PHP中创建一个报告库,并开发了一个名为ReportView的抽象类。这将提供报表的基本功能,如生成页眉和页脚,创建参数表单。

在这个类中还有一个名为generate_report的函数。目前它在抽象类中是空的,因为在这个层次上我们不知道报告的内容。此外,它还包含一个render函数,该函数调用generate_report函数并将输出发送到浏览器。

所以我需要当子类从ReportView继承时它必须实现generate_report方法,否则PHP必须给出错误。是否有任何关键字或方法,通过它我们可以强制实现一个特定的功能。

执行以下操作:

abstract class ReportView {
  abstract protected function generate_report();
  // snip ...
}
class Report extends ReportView {
  protected function generate_report() { /* snip */ }
}

任何扩展ReportView而不是抽象的类必须实现generate_report(以及它的超类中的任何其他抽象函数)。

听起来您最好创建一个接口,它将强制您在类中定义这些方法,然后实现该接口。

<?php
interface ReportInterface {
    public function generate();
}
class MyReportClass implements ReportInterface {
}

在此实例化MyReportClass将抛出致命错误,告诉您generate()尚未实现。

Edit:您还可以创建实现此接口的抽象类。您可以让您的抽象类包含所有扩展类需要的任何方法,并让您的接口定义您需要由扩展类定义的任何方法。

您还需要将该方法声明为abstract(并且不要给它一个方法体),否则派生类将不会强制实现它。

或者,您可以实现该方法,但让它只抛出一个异常(不确定为什么要这样做)。

最后,如果基类中的所有方法都是"抽象的"(没有主体),那么你可以将该类改为接口。