search

Home  >  Q&A  >  body text

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

$_SESSION['id'] = 1;

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

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

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


谁能详细讲讲, 谢谢 !

PHPzPHPz2902 days ago456

reply all(4)I'll reply

  • 高洛峰

    高洛峰2017-04-10 15:11:51

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

    unset($_SESSION['id']) 改變的是 $_SESSION 對象的值;
    unset($_SESSION) 改變的是 $_SESSION 的引用,並沒有改變 $_SESSION 對象。

    只有改變 $_SESSION 對象,纔會改變實際的 Session。

    然而,如果 $_SESSION = [];,則可以達到清空 Session 的目的。

    這說明,直接賦值於 $_SESSION 變量,也可以改變 $_SESSION 對象。

    所以,我猜測,PHP 引擎會根據 $_SESSION 變量最終引用的對象,修改 Session;如果沒有 $_SESSION 變量,則跳過這一步。

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:11:51

    当前这个请求的 context 中, $_SESSION 这个变量实际是指向存储 session 值的数组的引用。

    unset($_SESSION) 只是把当前这个请求的 context 中的 $_SESSION 这个变量写空了,并没有实际动到存储 session 的值的数组。

    下一次请求的时候,自然又会把下一次请求的 context 中的 $_SESSION 变量指向存储 session 值的数组的引用。

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:11:51

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

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:11:51

    $_SESSION 是超全局数组,肯定在全局变量区,程序员对全局变量区是没有写权限的,只有读权限;
    而$_SESSION['name']这样的键值在用户变量区,程序员对用户变量区有读写权限,所以可以unset($_SESSION['name']),而不能unset($_SESSION);
    我想应该是这样

    reply
    0
  • Cancelreply