【问题标题】:Checking for Serialized Objects检查序列化对象
【发布时间】:2008-11-07 03:30:31
【问题描述】:

是否有内置方法可以知道给定会话变量是否为序列化对象?假设我检索了一个像 $_SESSION['foo'] 这样的值,但我不知道它最初是一个字符串还是一个序列化对象。有什么方法可以检查,或者一旦序列化 PHP 是否只是将字符串视为字符串?

【问题讨论】:

    标签: php serialization session-variables


    【解决方案1】:

    您必须在将对象放入会话之前手动序列化对象,这是一个很常见的误解。事实并非如此。您可以简单地将对象实例分配给$_SESSION 中的插槽,PHP 会在请求之间自动为您序列化和反序列化它。

    【讨论】:

    • 真的吗?我不敢相信我不知道这个!
    • 实际上,经过一番研究,我不确定这是否正确。除非您在给定实例上使用 session_register(),否则在保存到会话时不会自动序列化。我会尝试用一个测试用例进行确认,以 100% 确定,然后发回我发现的内容。
    • 不,完全正确。而session_register 是一种陈旧且已弃用的会话使用方式 - 远离它。
    【解决方案2】:

    字符串是字符串是字符串。我认为你能做的最好的就是尝试反序列化它,如果它有效,它就有效。如果没有,那就没有。

    唯一的其他选择是使用正则表达式来查看它是否“看起来”像一个序列化对象。不过,在上面运行unserialize() 可能会更容易。

    【讨论】:

      【解决方案3】:

      你可以使用 is_a ...把​​它从会话中拉出来看看,你只需要知道要检查的类名。

      if (is_a($_SESSION['foo'], 'UserInfoObject')) {
        // We have one
      }
      

      看起来PHP5有一个更简单的方法:

      if ($_SESSION['foo'] instanceof UserInfoObject) {
            // We have one
      }
      

      http://www.php.net/manual/en/function.is-a.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 2010-11-22
        • 2012-06-20
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多