【问题标题】:Is this PHP conditional statement overly long?这个 PHP 条件语句是不是太长了?
【发布时间】:2013-09-06 10:27:29
【问题描述】:

我正在研究一本书,它创建了这个用于销毁会话的函数:

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() 不是在不需要特定引用 $_COOKIE 数组的情况下返回值“PHPSESSID”吗?

再进一步,条件语句不可以这样写吗:

if (session_id() != "")

看到 session_id() 返回 $_COOKIE 数组中键 [PHPSESSID] 的 VALUE,如果它不为空,那么肯定会设置返回 KEY [PHPSESSID] 的 session_name() , 因为它们在 $_COOKIE 数组中作为名称/值对一起存在?

为任何帮助干杯!

【问题讨论】:

  • @Deepanshu:为什么?只有两个字符串值可以通过isset 但失败!empty'''0')并且它们都不能用作会话名称。
  • @Jon 你是对的,我猜它只是让它更加防错,我也总是对此感到困惑!好吧@Nathan stackoverflow.com/questions/7191626/isset-and-empty-what-to-use这个链接可能会清除一些东西
  • @Deepanshu:手册足以解释empty 的工作原理,这里应该没有混淆。您建议将if (x) 更改为if (x && true),这显然是多余的。
  • @Jon 放置 !empty ('') 并不是多余的,因为谁知道呢,它可能会被设置为空白/空/或某个地方的空格......我总是喜欢两者
  • @Deepanshu:“因为谁知道”? 手册知道,它告诉那些阅读它的人。

标签: php if-statement session-cookies


【解决方案1】:

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

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

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

if (session_id() != "")

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

【讨论】:

  • 干杯乔恩。一个简单的问题:当您说“如果代码在 session_start 之前运行,那么 isset 将能够检测到稍后调用 session_start 时会话是否会继续”,我想知道这将如何工作?我假设在 session_start 被执行之前, $_COOKIE[session_name()] 不会返回任何东西。
  • @Nathan:基本上是错误的假设。 $_COOKIE 是从一开始就填充的,session_name() 总是返回一些值(从 php.ini 读取,除非你覆盖它)。如果碰巧设置了具有该名称的 cookie,则 $_COOKIE[session_name()] 将是它的值,没有什么不寻常的。
猜你喜欢
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多