Вы можете сделать его окончательным и предоставить ему приватный конструктор:
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 , чтобы изменить это, но, похоже, он этого не сделал.