Чего я хочу добиться:
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 __construct() {}
}
Здесь «final» заботится о требовании «не может быть расширено», в то время как приватный конструктор заботится о «не может быть создан».
Что касается «почему», вы не можете это сделать, это просто потому, что такова спецификация языка; также, как указывает @ CD001 в своем комментарии:
Весь смысл абстрактных классов в том, что они должны быть расширены, поэтому абстрактный финал является своего рода противоречием
Был на самом деле RFC изменить это, но, кажется, это не удалось.
Других решений пока нет …