2014-01-10 49 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()執行功能)發生腳本執行之後它從PHP本身預期行爲。

如此這般如下(我不是真的講它究竟是如何進去Laravel本身,而是更多的在PHP的內部):

  1. 你寫的對象放到session
  2. 你改變對象的狀態
  3. 腳本結束並寫入文件發生與對象更改狀態。

因此,如果對象存儲在會話中 - 總是將最新對象的狀態寫入會話文件。

+0

感謝您的快速響應。說得通。 – awei