Строковые константы PHP overuse?

У меня есть два частных случая, когда я не согласен с коллегой, следует ли использовать константы или нет.

Мы используем самодельную структуру, которая работает примерно так же, как Symfony 1.x.

  • Исходный код был в файле конфигурации маршрутизации PHP для маршрутизации, как этот:

    $router->map('/some_url', array('module' => 'some_module', 'action' => 'some_action'));
    $router->map('/some_other_url', array('module' => 'some_module', 'action' => 'some_action'));
    // etc.
    

    Сотрудник изменил его на:

    $router->map('/some_url', array(MODULE => 'some_module', ACTION => 'some_action'));
    $router->map('/some_other_url', array(MODULE => 'some_module', ACTION => 'some_action'));
    
    // + in constants.php file:
    define('MODULE', 'module');
    define('ACTION', 'action');
    

    IMO это постоянное чрезмерное использование: если понятие "модуль" или "действие" когда-либо переименовано, его нужно будет переименовать во весь код, написанный как строка или константа. Кроме того, определенные константные имена выше не имеют особого значения, благоприятствуя именованию столкновений/замешательств.

  • Пример исходного кода:

    if (isset($_SESSION['unid']) && isset($_SESSION['login'])) { ... }
    

    Изменено сотрудником:

    if (isset($_SESSION[UNID]) && isset($_SESSION[LOGIN])) { ... }
    
    // + in a constants.php file:
    define('UNID', 'unid');
    define('LOGIN', 'login');
    

    В нашем приложении названия сеансов vars unid и login явно маловероятны. Тем не менее, если объявление констант действительно было хорошей практикой здесь, я бы предложил хотя бы более точные имена, например FIELDNAME_UNID и FIELDNAME_LOGIN...

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

Спасибо.

ИЗМЕНИТЬ

Через несколько месяцев вот несколько (невероятных) строк из файла constants.php. Я определенно считаю, что это бесполезный беспорядок, похожий на этот пост DailyWTF. Слишком много констант убивают константы.

define('POST', 'POST');
define('GET', 'GET');

define('PROJECT', 'project');
define('APPLICATION', 'application');
define('MODULE', 'module');
define('ACTION', 'action');
define('ID', 'id');
define('SLUG', 'slug');
define('CONTROLLER', 'controller');
define('CONTENT', 'content');
define('AJAX', 'ajax');
define('EXECUTE', 'execute');
define('FORMAT', 'format');
define('BASE_HREF_CONSTANT', 'basehref');
define('UNID', 'unid');
define('USERNAME', 'username');
define('PASSWORD', 'password');
define('TEMPLATE', 'templates');
define('UNSECURE', 'unsecure');
define('MODE', 'mode');
define('MESSAGE', 'message');
define('TEMPORARY_SESSION', 'temporary_session');
define('ERRORMESSAGE', 'errormessage');
define('START_FROM', 'startfrom');
define('COUNT', 'count');

// and so on.

Ответ 1

Существует допустимый аргумент для использования таких констант.

Если вы случайно сделаете что-то вроде:

$router->map('/some_url', array('moduel' => 'some_module', 'action' => 'some_action'));

он потерпит неудачу в некотором undefined способе (обратите внимание на опечатанный "moduel" ).

Если вы делаете орфографическую ошибку или опечатку, когда участвует константа, PHP испускает уведомление, и вы сразу его поймаете.

Как часто это фактически спасает вас, это вопрос для обсуждения. Лично я обычно не думаю, что это стоит того.

Ответ 2

Преимущества

  • последствия константы орфографической ошибки должны вызывать E_NOTICE "Использование константы undefined", тогда как неверное письмо строкового литерала не будет предлагать такое раннее предупреждение.
  • если следовать логическому завершению, любые оставшиеся строковые литералы в коде должны быть естественным языком, и поэтому задача определения строк, которые должны быть завернуты в уровень перевода интернационализации, будет немного упрощена.

Недостатки

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

Ответ 3

И главная причина - автозаполнение IDE, конечно.
При использовании констант вам даже не понадобится писать полное имя константы (IDE поможет вам в этом), и вы будете абсолютно уверены, что у вас нет опечаток.

Это не слишком. Например, я пытаюсь избежать использования строк в коде.