PHP字符串常量使用过度?

问题描述 投票:10回答:3

我有两个特别的案例,我和同事的意见不一致,到底该不该用常量。

我们使用的是一个自制的框架,工作原理大致类似于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这是常量的过度使用:如果 "模块 "或 "动作 "的概念被重新命名,那么在整个代码中就必须重新命名,要么写成一个字符串,要么写成一个常量。另外,上面定义的常量名没有特定的意义,有利于命名碰撞冲突(collisionsconfus)。

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

    在我们的应用中,那些会话变量的名字 unidlogin 显然是不可能改变的。尽管如此,如果声明常量在这里真的是一个好的做法,我建议至少用更精确的名字,比如说 FIELDNAME_UNIDFIELDNAME_LOGIN...

引入这些常量是真的相关(也就是说,命名应该只是改进),还是(我猜)完全无用?

谢谢。

编辑

经过几个月的时间,这里有几句(不可思议)的台词。常量.php 文件.我绝对觉得这是一个完全无用的混乱,类似于 这篇每日一文. 太多的常量会杀死常量。

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.
php design-patterns constants anti-patterns string-literals
3个回答
6
投票

这样使用常量是有道理的。

如果你不小心做了这样的事情。

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

它将以某种未定义的方式失败(注意拼写错误的 "moduel")。

如果你在涉及常量时犯了拼写错误或打字错误,PHP 会发出一个通知,你会马上发现它。

这究竟能救你多少次是一个值得商榷的问题。就个人而言,我通常认为不值得这么麻烦。


8
投票

优点

  • 错拼常量的后果应该是触发E_NOTICE "使用未定义的常量",而错拼字符串文字则不会提供这样的预警。
  • 如果按照其逻辑结论,代码中任何剩余的字符串字面都应该是自然语言,因此识别要在国际化翻译层中包装的字符串的任务就会变得简单一些。

缺点

  • 需要你定义所有的常量,无论你是否需要它们。除非你定义了成千上万个常量,否则不可能成为你的性能瓶颈!当然主要原因是IDE的自动完成。

2
投票

当然,主要原因是 IDE 的自动完成。使用常量时,你甚至不需要写出常量的全名(IDE会在这方面帮助你),而且你将绝对确保你没有错别字。

这不是过度使用。例如,我正在努力避免在代码中使用字符串。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.