Конечный абстрактный класс в PHP? - PullRequest
0 голосов
/ 07 ноября 2018

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

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 для абстрактного класса в ...

Однако я хочу использовать это как " константа, не модифицируемая enum ". Стоит:

  • нельзя допускать продления
  • не допускается создание экземпляра

Почему переводчик запрещает это и как мне это реализовать?

1 Ответ

0 голосов
/ 07 ноября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...