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

DASCCC
  • 130
$_SESSION['id'] = 1;

用了 unset($_SESSION); 下次刷新页面 session_start(); 后,

$_SESSION['id'] 的值 = 1又取出来了 !

而用 unset($_SESSION['id']); 则可以正常清除 !


谁能详细讲讲, 谢谢 !

回复
阅读 2.9k
4 个回答

由於實現細節,「字面上」並不總是顯而易見地對應「實際上」。

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就没有了。

你知道吗?

宣传栏