2014-01-10 2 views
1

Я нашел это интересное поведение в 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); 
}); 

ответ

2

Поскольку объекты PHP передаются по ссылке (с PHP 5.0) и сеанс запись (если не выполняется непосредственно session_write_close() функции) происходят после выполнения сценария ожидается поведение от самого РНР.

Так происходит следующим образом (я на самом деле не говорить, как именно он идет в самой Laravel, но больше внутренний РНР):

  1. Вы пишете объект в ЗАСЕДАНИЕ
  2. Вы можете изменить состояние объекта
  3. Сценарии заканчиваются и запись в файл происходит с измененным состоянием объекта.

Так что если объект хранится в сеансе - всегда состояние последнего объекта записывается в файл сеанса.

+0

спасибо за быстрый ответ. имеет смысл. – awei

Смежные вопросы