2013-05-30 4 views
13

Прежде всего: я попытался это сделать, но в основном я нашел дискуссию о том, как определять массивы в константах и ​​другой несвязанной информации.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") подход, поскольку он кажется менее довольно и хлопот писать на моей немецкой клавиатуре :))

+7

Нет причин, по которым НЕ делать то, что вы сделали. Как вы сказали, это делает ваш код более читаемым. Что касается добавления накладных расходов, даже если это правда, это полностью минимальные накладные расходы. Что касается лучших способов, существуют вариации в том, что вы сделали, используя интерфейсы для определения констант. TL; DR - то, что вы сделали, хорошо. –

+1

Полностью согласен с тем, что @ N.B. сказал. Моя единственная проблема с этим сообщением заключается в том, что она должна быть закончена при просмотре кода, а не здесь;) – Prisoner

+1

В этом крошечном углу стиля кодирования ваш выбор является самым лучшим в этом плане.И когда речь идет о стиле, очень часто не бывает «абсолютного лучшего». ;-) Кстати, вы можете сделать этот класс 'abstract' или' final' дополнительным намеком на то, как он не должен использоваться. К сожалению, это не может быть и то, и другое, что запечатает сделку. – Jon

ответ

17

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

То, как я бы реализовать такой класс, как это»

// 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"); 
    } 
} 
+1

Почему я не думал о том, чтобы просто сделать конструктор частным, а не использовать абстрактный? Спасибо, ваш пример охватывает как «не создавать экземпляры», ни «не продлевать». – Anpan

1

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

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

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

+0

Я полагаю, что это немного похоже на удаление крышки для бутылки с зажигалкой. Зажигалка не была сделана для этой цели, но она работает просто отлично :) Если единственным аргументом против этой практики является: «Но для этого не было выделено классов, но у нее есть несколько других преимуществ, тогда я полагаю, что все в порядке. – Anpan

+0

Сортировка, да. :) – deceze

1

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

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

Если вы хотите использовать шаблон одноэлементный это будет работать слишком

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

+0

На самом деле я вообще не хочу никакого экземпляра. – Anpan

+0

Из определения класса, такого как «класс StatusCode», могут быть выполнены несколько экземпляров, так как управление памятью будет основано на этом, поэтому лучше определить статический класс StatusCode и использовать его как StatusCode :: * –

Смежные вопросы