PHP 5.6 не задана запись подмассива $_SESSION
Я получил следующую функцию:
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()
-функция все еще возвращается true
, и если вы var_dump($_SESSION)
ты это видишь $_SESSION[self::WATCHER_SESSION_KEY][$sessionID]
нулевой.
Как я могу сбросить переменную, чтобы также удалить ключ в массиве?
То, что я пытался, это не сработало:
// 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();
Я мог бы добавить дрянной хак во всем коде, чтобы проверить, является ли это null
, но затем "пустые" значения должны быть изменены на что-то другое (как предопределенный const, но это неприятный обходной путь и приводит к путанице для других разработчиков!)
У кого-нибудь есть идеи?
1 ответ
Получил это работает:
unset($GLOBALS['_SESSION'][self::WATCHER_SESSION_KEY][$sessionID]);
делает работу
http://php.net/manual/en/function.unset.php говорит:
Поведение unset() внутри функции может варьироваться в зависимости от типа переменной, которую вы пытаетесь уничтожить. […] Чтобы снять () глобальную переменную внутри функции, используйте массив $GLOBALS, чтобы сделать это
Похоже, классическое поведение PHP не определено в некоторых случаях "- пример.