如何在会话_解码结果中获取PHP引用变量

如何在会话_解码结果中获取PHP引用变量,php,session,Php,Session,我注意到PHP session_decode()函数有一个PHP引用变量的对象类型,用“R”表示。但是,我似乎无法找到如何让会话_decode()输出此对象类型。如果我将引用变量分配给$\u SESSION,然后调用SESSION\u decode(),则引用变量由SESSION\u decode()表示为与它引用的变量具有相同的对象类型,而不是“R”。会话解码对象类型“R”的用例是什么 啊,我想我看到它在做什么了。尝试这样做: $array = array(array(1)); $array[

我注意到PHP session_decode()函数有一个PHP引用变量的对象类型,用“R”表示。但是,我似乎无法找到如何让会话_decode()输出此对象类型。如果我将引用变量分配给$\u SESSION,然后调用SESSION\u decode(),则引用变量由SESSION\u decode()表示为与它引用的变量具有相同的对象类型,而不是“R”。会话解码对象类型“R”的用例是什么

啊,我想我看到它在做什么了。尝试这样做:

$array = array(array(1));
$array[1] =& $array[0];
因此,现在,数组应该如下所示:

array(
    0 => array(
        0 => 1
    ),
    1 => &array(
        0 => 1
    ),
)

这将触发引用类型(如果幸运的话)

对于
会话\u encode
要将变量编码为引用,引用的变量也需要在会话中。如果它不在会话中,那么它将把它编码为原始类型

$foo = 'bar';
$_SESSION['foo'] = $foo;
$_SESSION['bar'] = &$_SESSION['foo'];
$_SESSION['baz'] = &$foo;
$_SESSION['hey'] = &$foo;
var_dump(session_encode());
产出:

foo|s:3:"bar";bar|R:1;baz|s:3:"bar";hey|R:2;

如您所见,
foo
已存储为字符串
bar
已存储为对
foo
的引用,但由于
baz
引用了一个局部变量
$foo
,当会话在别处解码时,该变量可能不存在,PHP会自动将其转换为原始字符串类型。但是,
hey
也是对
$foo
的引用,但是由于引用的变量现在存储为
baz
,PHP将
hey
编码为对
baz
的引用,生成的格式是IIRC未记录的。因此,您可以尝试对格式进行反向工程,但如果遇到奇怪或模棱两可的行为,请不要感到惊讶。我建议从C源代码开始。。。哦,
R
很可能是“资源”,而不是参考。。。这是引用而不是资源我被会话编码的引用变量的值搞糊涂了。它是$\u会话的索引吗?@stevebot:它似乎是$\u会话中基于一的索引,不包括引用(这就是为什么
hey
会有2而不是3)。如果将
bar
更改为非参考编号,
hey
参考编号应变为3。