我正在编写一本书来创建此功能以销毁会话:
function destroy_session_and_data()
{
session_start();
$_SESSION = array();
if (session_id() != "" || isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time() - 2592000, '/');
session_destroy();
}
我想知道条件陈述是否过长了?
不能改写如下:
if (session_id() != "" || isset(session_name()))
也就是说,session_name()不返回值'PHPSESSID'而不需要对$ _COOKIE数组的特定引用吗?
更进一步,有条件的不仅仅是这样写的:
if (session_id() != "")
看到session_id()返回$ _COOKIE数组中键[PHPSESSID]的VALUE,如果它不为空,那么肯定不会说会返回KEY [PHPSESSID]的session_name()将被设置,因为它们一起作为$ _COOKIE数组中的名称/值对存在?
为任何帮助干杯!
答案 0 :(得分:0)
由于条件在session_start
¹之后运行,isset($_COOKIE[session_name()])
检查对我来说似乎是多余的。
会话ID可能为空并且isset
检查同时为真的情况是什么?我唯一能想到的是当会话ID持久性没有用cookie实现时,但是仍然从客户端收到了一个带有会话名称的cookie。在这种情况下,清除cookie将不起作用,因为会话不使用cookie。
据我所知,你的确可以简化条件
if (session_id() != "")
¹如果代码在 session_start
之前运行,那么isset
将能够检测到稍后调用session_start
时是否会继续会话,尽管此特定检查已简化,无法正确处理所有情况。此外,清除cookie作为响应不会改变当前请求的任何内容,因此虽然测试本身在理论上可能有用,但所提供的测试+响应代码毫无意义。