PHP字符串常量过度使用?

时间:2011-06-28 23:31:29

标签: php design-patterns constants anti-patterns string-literals

我有两个特殊情况,我不同意同事,是否应该使用常数。

我们使用一个大致类似于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');
    

    在我们的应用程序中,那些会话变量名称unidlogin显然不太可能发生变化。尽管如此,如果在这里声明常量确实是一种很好的做法,我建议至少使用更精确的名称,例如FIELDNAME_UNIDFIELDNAME_LOGIN ......

  3. 引入那些常常真正相关的常量(即命名应该改进),还是(我猜)完全没用?

    感谢。

    修改

    几个月后,这里有一些来自 constants.php 文件的(难以置信的)行。 我肯定觉得这是一个完全没用的混乱,类似于this DailyWTF post。常量太多会导致常数死亡。

    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 个答案:

答案 0 :(得分:8)

优点

  • 拼写错误常量的后果应该触发E_NOTICE'使用未定义的常量',而拼写错误的字符串文字不会提供这样的早期警告。
  • 如果遵循其逻辑结论,代码中任何剩余的字符串文字应该是自然语言,因此识别要包装在国际化转换层中的字符串的任务变得容易一些。

缺点

  • 要求您定义所有常量,无论您是否需要它们。除非你定义了成千上万的瓶颈,否则不太可能成为你的性能瓶颈!

答案 1 :(得分:6)

使用这样的常量有一个有效的参数。

如果您不小心做了类似的事情:

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

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

如果在涉及常量时出现拼写错误或拼写错误,PHP会发出通知,然后立即抓住它。

实际上拯救你的频率是一个争论的问题。就个人而言,我通常不认为这是值得的。

答案 2 :(得分:2)

当然,主要原因是IDE自动完成 使用常量你甚至不需要写常量的全名(IDE会帮助你),你绝对可以确定没有拼写错误。

没有过度使用。例如,我试图避免在代码中使用字符串。