$_SESSION['id'] = 1;
用了 unset($_SESSION); 下次刷新页面 session_start(); 后,
unset($_SESSION);
session_start();
$_SESSION['id'] 的值 = 1又取出来了 !
$_SESSION['id']
= 1
而用 unset($_SESSION['id']); 则可以正常清除 !
unset($_SESSION['id']);
谁能详细讲讲, 谢谢 !
学习是最好的投资!
由於實現細節,「字面上」並不總是顯而易見地對應「實際上」。
unset($_SESSION['id']) 改變的是 $_SESSION 對象的值;unset($_SESSION) 改變的是 $_SESSION 的引用,並沒有改變 $_SESSION 對象。
unset($_SESSION['id'])
$_SESSION
unset($_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就没有了。
$_SESSION 是超全局数组,肯定在全局变量区,程序员对全局变量区是没有写权限的,只有读权限;而$_SESSION['name']这样的键值在用户变量区,程序员对用户变量区有读写权限,所以可以unset($_SESSION['name']),而不能unset($_SESSION);我想应该是这样
由於實現細節,「字面上」並不總是顯而易見地對應「實際上」。
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就没有了。
$_SESSION 是超全局数组,肯定在全局变量区,程序员对全局变量区是没有写权限的,只有读权限;
而$_SESSION['name']这样的键值在用户变量区,程序员对用户变量区有读写权限,所以可以unset($_SESSION['name']),而不能unset($_SESSION);
我想应该是这样