Конечный абстрактный класс в PHP?

Чего я хочу добиться:

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

Решение

Вы можете сделать его окончательным и предоставить ему приватный конструктор:

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 изменить это, но, кажется, это не удалось.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]