PHP中的最终抽象类?

时间:2018-11-07 16:44:20

标签: php class abstract fatal-error final

我想要实现的目标:

abstract final class NoticeTypes {
    const ERROR = "error";
    const WARNING = "warning";
    const INFO = "info";
    const SUCCESS = "success";

    static function getAll() {
        $oClass = new ReflectionClass(__CLASS__);
        return $oClass->getConstants();
    }
}

解释器不允许这样做:

  

致命错误:无法在...中的抽象类上使用final修饰符。

但是我想将其用作“ 常量不可修改的枚举 ”。它应该:

  • 不允许扩展
  • 不允许实例化

为什么解释器不允许这样做,我应如何实施?

1 个答案:

答案 0 :(得分:5)

您可以将其定型并为其提供私有构造函数:

final class NoticeTypes {
  const ERROR = "error";
  const WARNING = "warning";
  const INFO = "info";
  const SUCCESS = "success";

  static function getAll() {
    $oClass = new ReflectionClass(__CLASS__);
    return $oClass->getConstants();
  }

  private function __construct() {}
}

在这里,“最终”处理“无法扩展”的要求,而私有构造函数负责“无法实例化”。

至于“为什么”,您不能这样做,这仅仅是因为语言规范;另外,正如@ CD001在他的评论中指出的那样:

  

抽象类的全部要点是要对其进行扩展,因此抽象最终类是一种矛盾

实际上有一个RFC可以更改它,但似乎没有成功。