在会话中存储对象后,在对象更改时会自动更新会话。为什么?

时间:2014-01-10 23:23:31

标签: php session

我在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);
});

1 个答案:

答案 0 :(得分:2)

由于PHP对象是通过引用传递的(因为PHP 5.0)和会话写入(如果不是直接用 session_write_close()函数执行)在脚本执行后发生,它是PHP本身的预期行为。

所以它如下(我不是在说Laravel本身究竟是怎么回事,而是在PHP的内部结构中更多):

  1. 您将对象写入SESSION
  2. 您更改了对象状态
  3. 脚本结束,写入文件时会发生对象更改状态。
  4. 因此,如果对象存储在会话中 - 总是将最新对象的状态写入会话文件。