0

我得到了以下功能:

public function stopWatcherSession($sessionID) {
    if(array_key_exists($sessionID, $_SESSION[self::WATCHER_SESSION_KEY])) {
        foreach ($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]['names'] as $v) {
            $ptype = $this->paramTypeFromName($v);
            unset($_SESSION[self::SESSION_KEY][$ptype][$v]); //does not work, sets entry to null
        }
        unset($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]); //does not work, sets entry to null
    }
}

正如评论所说,数组条目没有取消设置,array_key_exists()-function 仍然返回true,如果你var_dump($_SESSION)能看到,那$_SESSION[self::WATCHER_SESSION_KEY][$sessionID]就是 null。

如何取消设置变量,以便删除数组中的键?

我尝试过的事情,但没有奏效:

// v1 (tried also for `$_SESSION[self::WATCHER_SESSION_KEY][$sessionID]` )
$tmp = $_SESSION[self::SESSION_KEY][$ptype];
unset($tmp[$v]);
$_SESSION[self::SESSION_KEY][$ptype] = $tmp;

//v2
unset($_SESSION[self::WATCHER_SESSION_KEY][$sessionID]);
session_write_close();
session_start();

//v3 => v1 & v2 combined
$tmp = $_SESSION[self::SESSION_KEY][$ptype];
unset($tmp[$v]);
$_SESSION[self::SESSION_KEY][$ptype] = $tmp;
session_write_close();
session_start();

我可以在整个代码中添加一个糟糕的 hack 来检查它是否是null,但是必须将 »empty« 值更改为其他值(例如预定义的 const,但这是一个令人讨厌的解决方法,并导致其他开发人员感到困惑!)

有人有什么想法吗?

4

1 回答 1

2

得到它的工作:

unset($GLOBALS['_SESSION'][self::WATCHER_SESSION_KEY][$sessionID]);做这项工作。

http://php.net/manual/en/function.unset.php说:

函数内部 unset() 的行为可能因您尝试销毁的变量类型而异。[...] 要在函数内取消设置()全局变量,然后使用 $GLOBALS 数组来执行此操作

似乎是经典的»PHP 行为在某些情况下未定义«-示例。

于 2015-07-07T08:44:12.763 回答