<code>$_SESSION['id'] = 1; </code>
用了 unset($_SESSION);
下次刷新页面 session_start();
后,
$_SESSION['id']
的值 = 1
又取出来了 !
而用 unset($_SESSION['id']);
则可以正常清除 !
谁能详细讲讲, 谢谢 !
<code>$_SESSION['id'] = 1; </code>
用了 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就没有了。