Однобуквенный префикс для констант класса PHP? - PullRequest
4 голосов
/ 19 марта 2010

Я заметил, что многие (все?) PHP-константы имеют однобуквенный префикс, например E_NOTICE, T_STRING и т. Д. При определении набора констант классов, которые работают вместе, предпочитаете следовать подобной практике, или вы предпочитаете быть более многословным?

class Foo {
    // let's say 'I' means "input" or some other relevant word
    const I_STRING = 'string';
    const I_INTEGER = 'integer';
    const I_FLOAT = 'float';
}

или

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

Ответы [ 7 ]

6 голосов
/ 19 марта 2010

До версии 5.3 PHP был ограничен одним глобальным пространством имен. Это означает, что любые константы, объявленные с define или встроенные в язык, требуют префикса для разделения самих себя - пространства имен по дешевке, если хотите.

О самих константах: хотя E_NOTICE проще набирать, чем ERROR_NOTICE, у первого есть главный недостаток - отсутствие самодокументирования. Когда в глобальном контексте вам нужно не только разделять константы по префиксам, эти префиксы также должны быть как можно более описательными.

Константы класса - это немного другой зверь, так как вы всегда будете ссылаться на них по имени класса - будет встроено разбиение. Таким образом, вы получите Account::STATUS_CONFIRMED и Account::STATUS_BANNED. Но если бы я планировал иметь несколько десятков статусов, я бы поместил их в свой класс, например AccountStatus::CONFIRMED, AccountStatus::BANNED и т. Д.

Какое бы соглашение о присвоении имен вы ни выбрали для констант, основными соображениями являются разбиение и самодокументирование имен (многословие).

2 голосов
/ 19 марта 2010

Внутри класса лучше не использовать префиксы вообще, если только они не имеют особого смысла в своих контекстах. Буквенный префикс, который вы видите с константами, заключается в том, что в PHP не было пространств имен, когда они были представлены; но классы - это некоторая форма пространства имен, поэтому в этом нет необходимости.

Однако, если вы все равно собираетесь использовать префикс, я предлагаю вам использовать наиболее значимый, то есть полное слово вместо одной буквы. Я бы не догадался, что I означает INPUT.

2 голосов
/ 19 марта 2010

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

0 голосов
/ 22 марта 2010

Префиксы используются для символов пространства имен. Например. поскольку константы объявлены в глобальной области видимости, вы можете использовать префикс для определения его контекста и избежать конфликтов с другими использованиями символа в другом контексте.

Поскольку константы класса уже существуют в контексте (классе), на самом деле нет необходимости префиксировать его дальше. Вместо вашего примера это, вероятно, имеет больше смысла:

class Input {
  const STRING = 'string';
  const INTEGER = 'integer';
  const FLOAT = 'float';
}

Тем не менее, я считаю, что константы (классовые или глобальные), как правило, не то, что я часто использую в PHP. Обычно вы можете заменить константу более конкретным именем метода, и это, как правило, делает код более удобным для сопровождения. Например, вместо чего-то вроде этого:

$foo->addParameter("foo", Input::STRING);

Вы можете сделать это:

$foo->addStringParameter("foo");

легче читать и легче писать.

0 голосов
/ 19 марта 2010

В отличие от C и друзей, в динамических языках нам редко, если вообще требуется, предварительно объявленные константы. потому что описательные строковые значения работают так же хорошо. Нет реальной выгоды от использования

if($account->status == AccountStatus::CONFIRMED)

по сравнению с

if($account->is('confirmed'))

Последний более читабелен и требует меньше кода.

Прежде чем вы начнете писать возмущенный комментарий, посмотрите, как это делает jQuery: http://api.jquery.com/animate/. «hide», «toggle», «fast» и т. д. на самом деле являются константами, они просто не объявлены как таковые.

0 голосов
/ 19 марта 2010

Причина, по которой у большинства констант PHP есть префикс, заключается в том, что они используют пространство имен. Например, в E_USER_ERROR E_ делает две вещи:

  1. Он говорит вам, что константа связана с системой обработки ошибок
  2. Это делает так, что если вы хотите, чтобы в вашем приложении была константа с именем USER_ERROR, вы могли.

В PHP5 мы можем использовать константы классов, поэтому пространство имен больше не требуется. См. Например, DATE_ константы . Эквивалент DATE_ATOM равен DateTime::ATOM, где DateTime - это класс PHP, который работает с датами. DATE_ATOM все еще существует, предположительно по наследственной причине, но если бы эта постоянная была создана сегодня, ее просто назвали бы DateTime::ATOM.

В вашем случае, возможно, имеет смысл определить входной класс, который будет иметь эти константы:

class input {
    public const STRING='string';
    public const INTEGER = 'integer';
    public const FLOAT = 'float';
}
0 голосов
/ 19 марта 2010

Я предпочитаю быть более многословным

class Bar {
    const INPUT_STRING = 'string';
    const INPUT_INTEGER = 'integer';
    const INPUT_FLOAT = 'float';
}

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

...