1

我正在研究一本书,它创建了这个函数来破坏会话:

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] 的值,如果它不为空,那么肯定会设置返回键 [PHPSESSID] 的 session_name(),因为它们在 $_COOKIE 数组中作为名称/值对一起存在?

为任何帮助干杯!

4

1 回答 1

0

由于条件在session_start¹ 之后运行,因此isset($_COOKIE[session_name()])检查对我来说似乎是多余的。

在什么情况下会话 id 可能为空,同时isset检查为真?我能想到的唯一一种情况是,没有使用 cookie 实现会话 id 持久性,但是仍然从客户端收到了带有会话名称的 cookie。在这种情况下,清除 cookie 将不起作用,因为会话不使用 cookie。

据我所知,您确实可以将条件简化为

if (session_id() != "")

¹如果代码在此之前 session_start运行,则isset可以检测到session_start稍后调用会话是否会继续,尽管此特定检查已简化并且不能正确处理所有情况。此外,清除 cookie 作为响应不会改变当前请求的任何内容,因此虽然测试本身在理论上可能有用,但所提供的测试 + 响应代码是没有意义的。

于 2013-09-06T10:37:05.067 回答