$_SESSION['id'] = 1;
用了 unset($_SESSION); 下次重新整理頁面 session_start(); 後,
$_SESSION['id'] 的值 = 1又取出來了 !
而用 unset($_SESSION['id']); 則可以正常清除 !
誰能詳細講講, 謝謝 !
回複內容:
$_SESSION['id'] = 1;
用了 unset($_SESSION); 下次重新整理頁面 session_start(); 後,
$_SESSION['id'] 的值 = 1又取出來了 !
而用 unset($_SESSION['id']); 則可以正常清除 !
誰能詳細講講, 謝謝 !
由於實現細節,「字面上」並不總是顯而易見地對應「實際上」。
unset($_SESSION['id']) 改變的是 $_SESSION 對象的值;
unset($_SESSION) 改變的是 $_SESSION 的引用,並沒有改變 $_SESSION 對象。
只有改變 $_SESSION 對象,纔會改變實際的 Session。
然而,如果 $_SESSION = [];,則可以達到清空 Session 的目的。
這說明,直接賦值於 $_SESSION 變量,也可以改變 $_SESSION 對象。
所以,我猜測,PHP 引擎會根據 $_SESSION 變量最終引用的對象,修改 Session;如果沒有 $_SESSION 變量,則跳過這一步。
當前這個請求的 context 中, $_SESSION 這個變數實際是指向儲存 session 值的數組的引用。
unset($_SESSION) 只是把當前這個請求的 context 中的 $_SESSION 這個變數寫空了,並沒有實際動到儲存 session 的值的數組。
下一次請求的時候,自然又會把下一次請求的 context 中的 $_SESSION 變數指向儲存 session 值的數組的引用。
其實 kmxz 說的很清楚了,
無論是$_GET還,$_POST,$_COOKIE還是$_SESSION,
他們本身是php的一個變數,
當一個請求來的時候,zend會解析query_string,body,HTTP_COOKIE,phpsessionid,
然後將值裝入上面那幾個變數中,其中session是存在/tmp裡頭的檔案裡,檔案名稱就是phpsessionid值(均指預設情況下)。
session的隱藏檔是有一定幾率觸發刪除的,如果沒有被刪除,
下次請求的時候,zend又會根據phpsessionid的值找到session檔案,然後讀取並還原序列化(非php的unserialize函數)後重新裝進了$_SESSION裡,所以id又有值了。
而你 unset($_SESSION['id'])後,改變了/tmp裡的對應id的值(其實被刪了),所以重新請求後,id就沒有了。