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