6

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

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

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

4

3 回答 3

28

请执行下列操作:

abstract class ReportView {
  abstract protected function generate_report();

  // snip ...

}

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

任何扩展ReportView且非抽象的类都必须实现generate_report(以及其超类中的任何其他抽象函数)。

于 2013-05-30T17:42:22.850 回答
6

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

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

class MyReportClass implements ReportInterface {
}

在这里实例化MyReportClass会抛出一个致命错误,告诉你generate()还没有实现。

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

于 2013-05-30T17:44:23.417 回答
1

您还需要声明方法abstract(并且不要给它方法体),否则派生类将不会被迫实现它。

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

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

于 2013-05-30T17:47:33.663 回答