2013-01-23 53 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將重寫序列化行爲以銷燬其數據庫連接參考。