Реальный объект PHP SESSION - PullRequest
       8

Реальный объект PHP SESSION

2 голосов
/ 04 марта 2010

РЕДАКТИРОВАТЬ: (ОБНОВЛЕНО)

Может быть, мой вопрос не был достаточно ясен. Хорошо, давайте скажем так:

$arr["a"] = 10; 
var_dump($arr);
$arr["b"] =& $arr["a"];
var_dump($arr);

первый var_dump возвращает:

array
  'a' => int 10

Пока возвращается второй:

array
  'a' => &int 10
  'b' => &int 10

Если I unset ($ arr ["a"]) , он вернет:

array
  'b' => int 10

Правило состоит в том, что когда 2 или более переменных «указывают» на одно и то же содержимое, var_dump будет отображать ссылку с символом амперсанда (&).

В случае $ _SESSION, даже с register_long_arrays = Off $ _SESSION по-прежнему показывает ссылку. Таким образом, очевидно, что другая переменная также указывает на то же содержимое.

Другими словами, если я сбросил ($ _ SESSION), где-то есть еще одна переменная, с которой можно связать. В приведенном выше примере, когда я unset ($ arr ["a"]) , я все равно могу восстановить этот контент, если создаю ссылку, что-то вроде: $ arr ["z"] = & $ обр [ "б"] .

Итак, мой первоначальный вопрос был: кто-нибудь знает, ЧТО это другая переменная? Весьма вероятно, что такой переменной не существует ... но мне было интересно, почему внутри PHP эта ссылка отображается.

Спасибо


(Оригинальный вопрос:)

При создании сеанса в PHP, например:

session_start();
$_SESSION["name"] = "my name";

и сбросить глобальные переменные с помощью:

var_dump($GLOBALS);

вы увидите что-то вроде:

  'HTTP_SESSION_VARS' => &
    array
      'name' => string 'my name' (length=7)
  '_SESSION' => &
    array
      'name' => string 'my name' (length=7)
  'HTTP_SERVER_VARS' => 
    array
      ...

Как видите, обе переменные $ GLOBAL [HTTP_SESSION_VARS] и $ _SESSION ссылки на содержимое другого объекта ... Кто-нибудь знает, что это за объект?

Теоретически, если я сбрасываю обе переменные, каким-то образом должен быть доступ к этому содержание ... какая-либо подсказка?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 04 марта 2010

$HTTP_SESSION_VARS - старое, устаревшее название $_SESSION - вы больше не должны его использовать.

Эти $HTTP_*_VARS переменные не обязательно установлены: они будут установлены только в том случае, если включена директива конфигурации register_long_arrays, а также в последних версиях PHP (т.е. PHP 5.3) , он устарел.


Например, на моем сервере, на котором работает PHP 5.3.2, часть кода, которую вы дали:

session_start();
$_SESSION["name"] = "my name";
var_dump($GLOBALS);

Только выводит (после нескольких обновлений, что объясняет наличие PHPSESSID cookie) :

array
  'GLOBALS' => 
    &array
  '_POST' => 
    array
      empty
  '_GET' => 
    array
      empty
  '_COOKIE' => 
    array
      'PHPSESSID' => string 'fnlujfapqg7kdk1ocve6ndb282' (length=26)
  '_FILES' => 
    array
      empty
  '_SESSION' => &
    array
      'name' => string 'my name' (length=7)

Нет следов какой-либо переменной $HTTP_*_VARS: директива конфигурации register_long_arrays отключена.

0 голосов
/ 04 марта 2010

Это массив данных, который хранится в файле сеанса, который является фактическим временным файлом, хранящимся на сервере. Как они оба указывают, это массив, здесь нет объекта 'Session'. Эти значения заполняются при запуске session_start, который в основном загружает данные из файла на основе файла cookie PHPSESSID для этого пользователя.

0 голосов
/ 04 марта 2010

Ну, в PHP 5 $HTTP_SESSION_VARS хранится только из соображений совместимости. Вам настоятельно рекомендуется использовать $_SESSION вместо этого. Из руководства по PHP:

$ HTTP_SESSION_VARS содержит ту же исходную информацию, но не является суперглобальным. (Обратите внимание, что $ HTTP_SESSION_VARS и $ _SESSION - это разные переменные и что PHP обрабатывает их как таковых

EDIT
Вы говорите, что «уже знаете» !? Тогда какой у тебя вопрос? $_SESSION это НЕ объект, в конце концов, это ARRAY, суперглобальная переменная. Нет методов, нет членов. Вы можете получить доступ к его значениям, как с любым другим массивом: $_SESSION['key'].

Вы можете написать свой собственный класс Session, который охватывает управление сессиями PHP. Используйте метод session_set_save_handler , чтобы обойти встроенное управление сессиями и реализовать собственную логику.

Привет.

0 голосов
/ 04 марта 2010

Не HTTP_SESSION_VARS для обратной совместимости?

...