Подтвердить что ты не робот

Классы PHP, содержащие только константы

Прежде всего: я попытался это сделать, но в основном я нашел обсуждения о том, как определять массивы в константах и ​​другой несвязанной информации.

У меня есть вопрос относительно решения сделать мой код более удобочитаемым (и красивым), который только что произошел со мной. В основном у меня есть большинство функций, возвращающих код состояния, который указывает на успех, или, если что-то пошло не так, код ошибки. Для этого я создал класс под названием "StatusCode", который содержит только константы, например:

<?php
class StatusCode {
  const success = 0;
  const badArgument = -1;
  const badQuery = -2;
  const outOfMana = -3; //Really just for demonstration purposes
  ...
}

Цель состоит в том, чтобы заставить магические числа исчезнуть из моего кода и дать понять, что пошло не так, не прибегая к поиску объяснений где-то:

if (mana > 10) {
  //Do some magic
  return StatusCode::success;
}
else {
  //Oh god this is not good!
  return StatusCode::outOfMana;
}

Следует также исключить возможность случайного использования повторяющихся кодов ошибок. Я уверен, что это добавляет незначительные накладные расходы для моего приложения, но в свою очередь упростило мой код. Есть ли какая-то разрушающая землю причина не делать этого? Может быть, это еще лучший способ?

(Я избегал подхода define(CONSTANT, "value"), потому что он кажется менее симпатичным, и это хлопот писать на моей немецкой клавиатуре:))

4b9b3361

Ответ 1

В Java и других языках это обычно используется для определения констант пространства имен, чтобы избежать коллизий имен. См. здесь;

То, как я буду реализовывать такой класс, выглядит следующим образом:

// make this final so no one can extend it
final class Errors{
    const SUCCESS = 0;
    const BAD_ARGUMENT = -1;
    const BAD_QUERY = -2;
    const OUT_OF_MANA = -3;

    // make this private so noone can make one
    private function __construct(){
        // throw an exception if someone can get in here (I'm paranoid)
        throw new Exception("Can't get an instance of Errors");
    }
}

Ответ 2

Это имеет преимущество констант имен и группировки. Вы можете использовать отражение в этом классе для итерации по определенным константам, что позволяет, например, проверять, что значение является значением определенной константной группы (включение намека на бедный человек с постоянным типом).

Недостатком является то, что вы как бы злоупотребляете классом (хотя и немного). Пуристам это может не понравиться. Константы, которые не используются в одном классе, должны быть глобальными константами; вы даже можете пропустить их в нечто вроде \StatusCodes\SUCCESS в PHP 5.3 +.

Выбор за вами действительно.

Ответ 3

Создание класса static решит вашу проблему и не создаст несколько экземпляров StatusCode

Пространства имен могут использоваться, если вы считаете, что ваше приложение может иметь несколько классов StatusCode, но все же StatusCode будет статическим.

Если вы хотите использовать шаблон singleton, это тоже будет работать

Выбор за вами!