2

编辑:(更新)

也许我的问题不够清楚。好的,让我们这样说:

$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

如果我unset($arr["a"])它将返回:

array
  'b' => int 10

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

在 $_SESSION 的情况下,即使 register_long_arrays = Off $_SESSION 仍然显示引用。所以很明显其他变量也指向相同的内容。

换句话说,如果我 unset($_SESSION) 还有其他变量可以链接到某个地方。在上面的示例中,当我unset($arr["a"])创建链接时,我仍然可以恢复该内容,例如:$arr["z"] =& $arr["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

4 回答 4

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);

仅输出(经过几次刷新,这解释了PHPSESSIDcookie 的存在)

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

于 2010-03-04T06:51:42.717 回答
0

好吧,PHP 5$HTTP_SESSION_VARS仅出于兼容性原因而保留。强烈建议您$_SESSION改用。来自 PHP 手册:

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

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

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

问候。

于 2010-03-04T06:52:13.067 回答
0

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

于 2010-03-04T06:53:11.743 回答
0

HTTP_SESSION_VARS 不是为了向后兼容吗?

于 2010-03-04T06:50:52.850 回答