使用PHP$\u会话变量,然后将其取消设置

使用PHP$\u会话变量,然后将其取消设置,php,session,drupal-8,Php,Session,Drupal 8,我正在构建一个Drupal8站点。在模块预处理函数中,我试图检查页面加载时是否存在$\u会话变量,对该变量执行某些操作,然后取消设置该变量。以下是代码的简化版本: 函数地理定位\u过滤器\u预处理\u页面(){ 如果(isset($_会话['blocked_submission'])){ $messageText=$\会话['blocked\ u submission']['text']; $messageType=$\会话['blocked\ u submission']['type']; e

我正在构建一个Drupal8站点。在模块预处理函数中,我试图检查页面加载时是否存在
$\u会话
变量,对该变量执行某些操作,然后取消设置该变量。以下是代码的简化版本:

函数地理定位\u过滤器\u预处理\u页面(){
如果(isset($_会话['blocked_submission'])){
$messageText=$\会话['blocked\ u submission']['text'];
$messageType=$\会话['blocked\ u submission']['type'];
echo$messageText.$messageType;
取消设置($_会话['blocked_submission']);
}
}
如果我删除
unset
函数调用,那么文本将按预期打印出来


除非代码执行进入
if
块,否则无法取消设置变量,但回音不会像没有进入
if
块一样发生。我认为PHP是线性执行的,所以我希望echo语句会出现,然后
$\u SESSION
变量会被取消设置。我遗漏了什么?

在某些情况下,除非首先启动会话,否则取消设置会话变量不起作用。如果您是从“注销”页面引用,则可能需要检查您的代码。 unset函数仅在会话_start()时工作;在脚本中调用

 session_start();
在您的情况下,您可以像下面那样声明会话,这意味着您的代码可能引用未设置的变量,因此在尝试输出它们之前,请尝试检查类型和文本

 $_SESSION['blocked_submission'] = "";

不要使用
unset($\u会话)取消设置整个
$\u会话
因为这将禁用通过$\u session superglobal注册会话变量。

简化版不包含此问题。唯一的补充是,它被包装在一个预处理函数中,如下所示:函数geolocation\u filter\u preprocess\u page(){…我的代码…}是的,PHP是线性执行的。这个问题肯定比你描述的要复杂得多。当我按照上面打印的方式运行这个函数时,它不会打印任何内容,但如果我删除unset函数,它会打印出来。是Drupal正在做的改变PHP功能的特定事情吗?您正在检查会话本身是否已设置。请检查是否也设置了数组元素“text”和“type”,如果它们为null或为空,则echo不会输出任何内容。