我在PHP中发现了这个有趣的行为。我无法理解为什么会话中的对象正在更新,即使我在操作后没有明确地将它存储在会话中。
有人可以赐教吗?虽然下面的代码片段是使用Laravel 4框架编写的,但基础会话相关的行为是PHP的一个功能。示例代码:
Route::get('/', function()
{
$stored = Session::get('testing');
if (!$stored)
{
$stored = new StdClass;
$stored->counter = 0;
Session::set('testing', $stored);
}
$stored->counter ++;
// Session::set('testing', $stored);
// if the above line were NOT commented out, i could understand why the counter keeps on increasing.
var_dump($stored->counter);
});
答案 0 :(得分:2)
由于PHP对象是通过引用传递的(因为PHP 5.0)和会话写入(如果不是直接用 session_write_close()函数执行)在脚本执行后发生,它是PHP本身的预期行为。
所以它如下(我不是在说Laravel本身究竟是怎么回事,而是在PHP的内部结构中更多):
因此,如果对象存储在会话中 - 总是将最新对象的状态写入会话文件。