2013-01-23 32 views
1

将对象引用存储在会话容器($ _SESSION)中时会发生什么?

在这个过程中,当这些值被序列化时,对象引用是否被转换为拷贝或者它们是否被破坏?很多提前

+1

你可以通过在数据库中实现存储会话来自己测试。 –

+0

我宁愿通过序列化包含两次相同引用的数组来测试它。我敢打赌,这两个参考文件最终都是不同的副本,但情况可能并非如此。 – zneak

回答

1

当会话书面

session_start(); 
$testArrayA = []; 
$testArrayB = [];  
$testArrayA["abc"] = &$testArrayB; 
$testArrayB["def"] = "test2"; 
$_SESSION["myvalue"] = $testArrayA; 

谢谢,这被序列化。序列化并不关心引用,因为它只是读取数据(如果它从参考读取它将解析引用的目标)。

您可以通过更改最后一行看到此行为:

var_dump(serialize($testArrayA)); 

string(44) "a:1:{s:3:"abc";a:1:{s:3:"def";s:5:"test2";}}" 

这就是被存储在会话。

请注意,如果某个对象实现了__sleepSerializable接口,则其序列化行为是唯一的。我相信PDO将重写序列化行为以销毁其数据库连接参考。