上述代码会产生怎么样的结果?
a.php: //报错
这个页面的值不难,将会报出一个notice( Undefined index: a)错误,因为cookie的返回值具有慢一拍特性,在页面中设置setcookie后,当用户访问时,需要把cookie键值对包含在http响应头返回给客户端,当你下次访问的时候,浏览器会着这份具有cookie值的请求头请求服务器,服务器也就知道当前的客户端存在这一份cookie值,然后再用到其他业务逻辑.
b.php: //abc
这个页面的值是abc,其实第一次看到这个答案我也很惊讶.
其实原理是这样的:
我们一直对cookie/session,$_COOKIE/$_SESSION混为一谈了,其实呢,这四个(两组)是独立开来的,cookie/session是属于http里的值,$_COOKIE/$_SESSION是属于php里面的全局变量.我们在setcookie的时候,实际上给http中的cookie赋值,而http中的cookie与php中的超全局变量$_COOKIE关联上.所以$_COOKIE才有这个值abc,并不是直接赋值到$_COOKIE超全局变量上的.所以同样道理,unset($_COOKIE)销毁的是$_COOKIE这个变量,与http头中的cookie值无关,所以在b.php依旧可以打印出来.
解决办法就是 setcookie(a,'',-1)将这个cookie设置为过期,那么b.php就不能再获取到了.
-----------------------------------分割线-----------------------------------------
同样的道理可以用到session机制里,
在这幅图里,最终还是能够打印出$_SESSION的值,因为session_destroy将http中的session和超全局变量$_SESSION的关系分离了,详见手册
session_destroy 是把session和$_SESSION之间的关系割开了,如果你想重新恢复session函数功能,你就要重新打开session_start();例如下图,
这样子session值就会被顺利删掉,那么与它关联的$_SESSION超全局变量值也就消失了
总结:
- session_unset销毁的不是$_SESSION这个变量值(和unset这个函数不同,unset直接操作变量),而是http中的session值.具体可以自己分别开启与不开启session_start然后session_unset进行实验
- $_SESSION/session值,$_COOKIE/cookie值不是对等的,cookie/session操作着$_COOKIE/$_SESSION变量值,所以在进行函数操作的时候一定要搞明白,他究竟是对变量操作还是http协议操作!
- 让cookie过期做好的策略是将它过期.
欢迎转载,但一定要保存原址+作者
作者:PHP程序痴-妖都小陈
原文地址:http://www.cnblogs.com/gzchenjiajun-php/p/5036462.html