unset($_SESSION) 不蘊涵 unset($_SESSION['id'])

來源:互聯網
上載者:User
$_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就沒有了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.