我想要实现的目标:
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修饰符。
但是我想将其用作“ 常量不可修改的枚举 ”。它应该:
为什么解释器不允许这样做,我应如何实施?
答案 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可以更改它,但似乎没有成功。