【发布时间】:2022-10-13 15:49:10
【问题描述】:
我们正在升级到 PHP 8.1。一个新功能是未定义的数组键会引发警告。
不幸的是,这会干扰轻松使用关联数组(例如 $_SESSION 变量)的能力。我了解预定义变量的优点,我不是在寻找关于这些优点的讨论。关联数组的想法是您可以轻松地将内容添加到会话中,并且所有未分配的内容都被评估为空。但现在它也发出警告;必须采取一些措施来解决这个问题。
这是一些代码的示例:
$_SESSION['is_condition'] = true;
在代码的另一个地方,出现以下情况
if ($_SESSION['is_condition']) ...
如果这发生在未定义“is_condition”会话变量的上下文中,则将其值评估为 null 的预期结果就是我们想要的。但是现在必须做其他事情来处理它未定义的可能性。
有几种方法可以解决这个问题:
-
预定义所有值为 null 的会话变量。似乎它不是关联数组的精神。现在每个脚本都必须调用一组冗长的代码。
-
每当需要关联数组元素的值时,请使用空合并运算符。在整个代码库中放置许多额外的运算符是一个丑陋的要求。
-
更改我们的自定义错误处理函数以忽略未定义的数组键错误。抑制警告并增加开销是一个非常糟糕的主意。
这些方法都不是非常理想的。
解决此问题的一种理论方法是使用数组初始化语句,将所有可能的关联键分配给 null。我不知道有这样的事情。
我的问题是我是否缺少其他一些方法,例如仅抑制此特定警告的参数。
【问题讨论】:
-
您还可以使用isset、array_key_exists 和!empty
-
未定义的数组索引总是触发警告。我认为它简单地从
E_NOTICE更改为E_WARNING。 -
大多数应用程序没有很多有条件分配的会话变量,因此您不必在很多地方处理这个问题。对于您所做的那些变量,空合并运算符是最简单的解决方案。
标签: php undefined associative-array php-8.1