PHP的真实SESSION对象

时间:2010-03-04 06:44:52

标签: php reference httpsession superglobals var-dump

编辑:(更新)

也许我的问题不够明确。好的,我们这样说吧:

$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

如果我取消设置($ arr [“a”]),它将返回:

array
  'b' => int 10

规则是,当2个或更多变量“指向”相同内容时,var_dump将显示带有&符号(&)的引用。

对于$ _SESSION,即使 register_long_arrays = Off ,$ _SESSION仍会显示引用。所以很明显,其他变量也指向相同的内容。

换句话说,如果我取消设置($ _ SESSION),仍然可以链接到某个地方的其他变量。在上面的示例中,当我取消设置($ arr [“a”])时,如果我创建链接,我仍然可以恢复该内容,例如: $ arr [“z”] = &安培; $的常用3 [ “b” 的即可。

所以,我最初的问题是,有谁知道其他变量是什么?这个变量很可能不存在......但我想知道为什么PHP内部会显示这个变量。

谢谢


(原始问题:)

在PHP中创建会话时,例如:

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

并使用以下内容转储GLOBAL变量:

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 个答案:

答案 0 :(得分:5)

$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配置指令被禁用。

答案 1 :(得分:0)

HTTP_SESSION_VARS不是为了向后兼容吗?

答案 2 :(得分:0)

好吧,在PHP 5中$HTTP_SESSION_VARS仅出于兼容性原因而保留。强烈建议您使用$_SESSION代替。从PHP手册:

  

$ HTTP_SESSION_VARS包含相同的初始信息,但不是超全局信息。   (注意> $ HTTP_SESSION_VARS和$ _SESSION是PHP处理的不同变量   他们就这样)

修改
你说你“已经知道”了!?你的问题是什么? $_SESSION不是一个对象,毕竟它是一个ARRAY,一个超全局变量。没有方法,没有成员。您可以像访问任何其他数组一样访问它的值:$_SESSION['key']

您可以编写自己的Session类来包装PHP的会话管理。使用session_set_save_handler方法绕过内置会话管理并实现自己的逻辑。

问候。

答案 3 :(得分:0)

这是存储在会话文件中的数据数组,该文件是存储在服务器上的实际临时文件。就像它们都指向的那样,它是一个数组,没有'Session'对象。运行session_start时会填写这些值,它基本上根据该用户的PHPSESSID cookie从文件中加载数据。