我想要实现的目标:
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修饰符
但是我想把它当作一种“永不改变的枚举”。这应该:
为什么口译员不允许这样做,我该如何实施呢?
你可以把它作为最终并给它一个私有的构造函数:
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来改变它,但它似乎没有成功。