PHP строковые константы злоупотребляют? - PullRequest
10 голосов
/ 29 июня 2011

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

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

  1. Исходный код был в файле конфигурации 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, это постоянное злоупотребление: если понятие «модуль» или «действие» когда-либо переименовывается, его нужно будет переименовать ввесь код, записанный в виде строки или константы.Кроме того, указанные выше имена констант не имеют особого значения, способствуя коллизиям / путанице имен.

  2. Исходный пример кода:

    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');
    

    В нашем приложении эти имена сессий 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.

Ответы [ 3 ]

8 голосов
/ 29 июня 2011

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

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

Недостатки

  • требует, чтобы вы определили все константы, нужны они вам или нет.Однако вряд ли это будет вашим узким местом в производительности, если вы не определите тысячи из них!
6 голосов
/ 29 июня 2011

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

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

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

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

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

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

2 голосов
/ 29 июня 2011

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

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

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