使用$ _SESSION键的字符串或常量?

时间:2011-12-23 17:40:19

标签: php constants

我有很多会话变量。我应该用这个

吗?
$_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) {
....

第二个很短但是如果有变化,我们必须改变“路由”的存在。此外,它可能会污染会话范围,因为“路由”字符串非常常见。

2 个答案:

答案 0 :(得分:3)

如果你真的需要一个会话助手(例如:如果你真的需要一个抽象PHP会话的类),那么只在该类中使用$_SESSION超全局(而不是在外部)。所以你已经封装了superglobal,你可以用test-double来替换它。

接下来,这取决于会话存储的使用。我敢打赌它是高度动态的,所以我没有看到将数组键指定为常量而没有任何进一步使用的重要值(例如,没有进行有效/无效的键检查)。

我希望这听起来并不严厉,因为它不是故意的。请询问是否有不清楚的地方或您还有其他问题。正如jprofitt在他的回答中所写,阻止magic numbers是非常有用的,但我并不完全相信,你实际上是在这里介绍它们,或者它不仅仅是动态属性(特别是如果你创建了一个会话存储类) )。

答案 1 :(得分:2)

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

正如您所提到的使用常量的可维护性,它们可以使实现更新更加简单。另一个好处是你可以记录它们,并且很多IDE会选择它并在你忘记MODULE_A或MODULE_B引用的内容时提供帮助(例如)。虽然它可能会让你输入一些额外的字符,但它比错误拼写“路由”更好,并且必须深入挖掘你的代码以找出你收到错误的原因。