0

我们正在升级到 PHP 8.1。一个新功能是未定义的数组键会引发警告。

不幸的是,这会干扰轻松使用关联数组(例如 $_SESSION 变量)的能力。我理解预定义变量的优点,我不是在寻找关于这些优点的讨论。关联数组的想法是您可以轻松地将内容添加到会话中,并且所有未分配的内容都被评估为空。但现在它也发出警告;必须采取一些措施来解决这个问题。

这是一些代码的示例:

$_SESSION['is_condition'] = true;

在代码的另一个地方,出现以下情况

if ($_SESSION['is_condition']) ...

如果这发生在未定义“is_condition”会话变量的上下文中,则将其值评估为 null 的预期结果就是我们想要的。但是现在必须做其他事情来处理它未定义的可能性。

有几种方法可以解决这个问题:

  1. 预定义所有值为 null 的会话变量。似乎它不是关联数组的精神。现在每个脚本都必须调用一组冗长的代码。

  2. 每当需要关联数组元素的值时,请使用空合并运算符。在整个代码库中放置许多额外的运算符是一个丑陋的要求。

  3. 更改我们的自定义错误处理函数以忽略未定义的数组键错误。抑制警告并增加开销是一个非常糟糕的主意。

这些方法都不是非常理想的。

解决此问题的一种理论方法是使用数组初始化语句,将所有可能的关联键分配给 null。我不知道有这样的事情。

我的问题是我是否缺少其他一些方法,例如仅抑制此特定警告的参数。

4

2 回答 2

1

我的建议是在处理这个问题的会话机制上写一个抽象。我会选择一个类,但即使是一个简单的函数也可以工作:

function getValueFromSession(string $key, mixed $defaultValue = null) : mixed
{
   return isset($_SESSION[$key]) ? $_SESSION[$key] : $defaultValue;
}

这有一个额外的好处,即允许您更改底层会话存储(例如到 Redis),而无需更改会话值访问的每个实例。

于 2022-02-07T20:59:43.797 回答
0

你假设它$_SESSION['whatever']总是可用的。您可以使用 isset 包装所有条件,如下所示:

if (isset($_SESSION['is_condition'])) {
//Do Whatever
}

或者你可以做一些笨拙的事情,比如把它放在文件的顶部。

if (isset($_SESSION['is_condition'])) {
//Do something
} else {
$_SESSION['is_condition'] = NULL;
} 

从那时起,任何时候你检查会话中的那个键,它至少会被设置为某个东西,并且不会发出警告或通知。这很丑陋,但它会起作用。

于 2022-02-07T20:51:03.353 回答