Home > Backend Development > PHP Tutorial > unset($_SESSION) 不蘊涵 unset($_SESSION['id'])

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

WBOY
Release: 2016-06-06 20:40:43
Original
1228 people have browsed it

<code>$_SESSION['id'] = 1;
</code>
Copy after login
Copy after login

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

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

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


谁能详细讲讲, 谢谢 !

回复内容:

<code>$_SESSION['id'] = 1;
</code>
Copy after login
Copy after login

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template