我正在用PHP创建一个报告库,并开发了一个名为 ReportView 的抽象类。这将提供报告的基本功能,如生成页眉和页脚,创建参数表单。
此类中将有另一个名为 generate_report 的函数。目前它在抽象类中是空的,因为在这个级别我们不知道报告的内容。此外,它还包含一个渲染函数,该函数调用此generate_report函数并将输出发送到浏览器。
因此,只要子类继承自ReportView,它就必须实现 generate_report方法,否则PHP必须给出错误。是否有任何关键字或方法可以强制执行特定功能。
答案 0 :(得分:22)
执行以下操作:
abstract class ReportView {
abstract protected function generate_report();
// snip ...
}
class Report extends ReportView {
protected function generate_report() { /* snip */ }
}
任何扩展ReportView
且不是抽象的类必须实现generate_report
(以及其超类中的任何其他抽象函数)。
答案 1 :(得分:5)
听起来你最好创建一个接口,这会强制你在类中定义那些然后实现这个接口的方法。
<?php
interface ReportInterface {
public function generate();
}
class MyReportClass implements ReportInterface {
}
在此处实例化MyReportClass
会产生致命错误,告诉您generate()
尚未实施。
编辑:您还可以创建实现此界面的抽象类。您可以让您的抽象类包含所有扩展类所需的任何方法,并让您的接口定义您需要通过扩展类来定义的任何方法。
答案 2 :(得分:1)
您还需要将方法声明为abstract
(并且不要给它一个方法体),否则不会强制派生类实现它。
或者,您可以实现该方法但只是抛出异常(不确定为什么要这样做)。
最后,如果 all 基类中的方法是“抽象”(没有实体),那么您可以将该类转换为接口。