PHP中的最终抽象类?

问题描述 投票:2回答:1

我想要实现的目标:

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修饰符

但是我想把它当作一种“永不改变的枚举”。这应该:

  • 不允许延长
  • 不允许被实例化

为什么口译员不允许这样做,我该如何实施呢?

php class abstract fatal-error final
1个回答
6
投票

你可以把它作为最终并给它一个私有的构造函数:

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() {}
}

这里,“final”负责“不能扩展”的要求,而私有构造函数负责“无法实例化”。

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

抽象类的全部意义在于它们要被扩展,所以抽象的最终类似于矛盾

实际上有一个RFC来改变它,但它似乎没有成功。

© www.soinside.com 2019 - 2024. All rights reserved.