繁体   English   中英

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

[英]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) {
....

第二个很短,但是如果有更改,我们必须在存在“路由”的任何地方进行更改。 此外,由于“路由”字符串非常普遍,它可能会污染会话范围。

如果确实需要会话帮助程序(例如:如果确实需要抽象PHP会话的类),则仅在该类内部(而不是外部)使用$_SESSION超全局变量。 因此,您已封装了超全局变量,可以将其替换为test-double。

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

我希望这听起来并不苛刻,因为它并非如此。 请询问是否不清楚或您还有其他问题。 正如jprofitt在他的回答中所写,防止幻数是非常有用的,但我并不完全相信,您实际上是在这里引入它们,或者它不仅仅是动态属性(尤其是在创建会话存储类时)。

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

正如您提到的使用常量的可维护性一样,它们可以使更新的实现变得更加简单。 另一个好处是您可以对其进行文档化,并且很多IDE都会接手并提供帮助,以防您忘记MODULE_A或MODULE_B的含义(例如)。 尽管它可能使您键入一些额外的字符,但比在某处拼写“ routing”(路由)并不得不仔细检查代码来弄清楚为什么会出错的方法要好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM