PHP 字符串常量过度使用?

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

    在我们的应用程序中,那些 session 变量名称 unidlogin 显然不太可能更改。尽管如此,如果在这里声明常量真的是一个好习惯,我会建议至少使用更精确的名称,例如 FIELDNAME_UNIDFIELDNAME_LOGIN...

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

谢谢。

编辑

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

最佳答案

优点

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

缺点

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

关于PHP 字符串常量过度使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514260/

相关文章:

c++ - 这个typedef是必需的吗?

javascript - 如何在 ESLint 中对齐 const 缩进?

javascript - const 已经在 ES6 开关 block 中声明

php - 使用parent id搜索时如何查询产品?

php - Python:PHP "=="的等价物是什么

php - 身份验证是我的域还是我的应用程序的问题?

php - 如果有多个可用值,则以逗号分隔的产品属性术语

php - 在 JS 处理程序或 PHP ajax 函数中为 ajax 函数生成 html 更好吗?

java - 在 Java 中维护错误代码列表的最有效方法

java - 我如何/在哪里可以通过示例代码和解释了解真实世界 Java Web 应用程序的结构