设计模式-PHP字符串常量过度使用


design patterns - PHP string constants overuse?

我有两种特殊的情况,我不同意同事的意见,无论是否应该使用常量。

我们使用一个自制的框架,其工作原理大致类似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。。。

引入这些常量真的有意义吗(也就是说,命名应该改进一下(,还是(我想(完全无用?

谢谢。

编辑

几个月后,以下是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.

优点

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

的缺点

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

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

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

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

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

如果您在涉及常量时出现拼写错误或拼写错误,PHP会发出一个通知,您会立即发现。

这实际上多久能救你一次还需要争论。就我个人而言,我通常认为这不值得麻烦。

当然,主要原因是IDE自动完成
通过使用常量,您甚至不需要编写常量的全名(IDE将在这方面为您提供帮助(,并且您将绝对确保没有拼写错误。

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