$_SESSION's键使用字符串或常量


Use string or constant for $_SESSION's key?

我有许多会话变量。我应该使用

吗?
$_SESSION[SessionHelper::ROUTING] = SessionHelper::MODULE_A;
class SessionHelper {
   const ROUTING = 'SessionHelper.routing';
   const MODULE_A = 1;
   const MODULE_B = 2;
}

还是这个?

$_SESSION['routing'] = 1;

第一个似乎是可维护的,但在某些情况下很难阅读。例如:

if(isset($_SESSION[SessionHelper::ROUTING]) && 
   $_SESSION[SessionHelper::ROUTING] = SessionHelper::MODULE_A) {
....

第二个很短,但是如果要更改,我们必须更改"路由"存在的所有地方。此外,它还会污染会话作用域,因为'routing'字符串太常见了。

如果你真的需要一个会话帮助器(比如:如果你真的需要一个抽象PHP会话的类),那么只在该类内使用$_SESSION超全局变量(而不是在该类外)。所以你已经封装了超全局变量,你可以用test-doubles替换它。

接下来,这取决于会话存储的使用。我敢打赌它是高度动态的,所以我不认为在没有任何进一步使用的情况下首先将数组键指定为常量有多大价值(例如,不进行有效/无效键检查)。

我希望这听起来不刺耳,因为它不是这个意思。如果有不清楚的地方或有其他问题,请询问。正如jprofitt在他的回答中所写的那样,防止幻数是非常有用的,但我不完全相信,您实际上在这里引入了它们,或者它不仅仅是动态属性(特别是如果您创建了会话存储类)。

神奇的字符串和数字是邪恶的——即使你是唯一需要使用它们的人。只需要忘记在一个地方更新它们,整个应用程序就可能出现故障。

正如您提到的使用常量的可维护性,它们可以使实现更新变得简单得多。另一个好处是,您可以对它们进行记录,并且在您忘记MODULE_A或MODULE_B引用(例如)的情况下,许多ide将会获取并提供帮助。虽然它可能会让你输入一些额外的字符,但这比在某个地方拼错"routing"要好,因为你必须仔细研究你的代码来弄清楚为什么你会得到一个错误。