【问题标题】:the PHP variable handling function, serialize()PHP 变量处理函数,serialize()
【发布时间】:2011-03-18 15:51:30
【问题描述】:

首先,我阅读了 PHP 手册,并对其进行了测试。 其次,我仍然不明白它的真正作用是什么? 为什么要序列化一个变量?

【问题讨论】:

标签: php serialization variables


【解决方案1】:

您可能不希望这样序列化变量,但序列化对象和其他复杂数据结构很有用。

不要创建包含大量列的数据库表,而是创建具有主键和 blob 的表并将类或数组序列化到其中。这样,您就拥有了一个无限灵活的系统,如果您需要向数据库表中添加新数据,则无需添加更多列。

这是一个愚蠢的例子,但如果你仔细想想,将对象持久化到数据库中是非常有用的。

【讨论】:

  • 这不是一个很好的例子,IMO。将数据作为序列化字符串存储在数据库中意味着您不能对其使用普通的数据库查询。它偶尔有用,但不是该函数的主要实用程序。
  • 这就是为什么我说这是一个愚蠢的例子,我发现将购物车对象序列化到数据库中很有用,这样他们的购物车就可以很容易地反序列化并激活,生成发票等等。
【解决方案2】:

原因可能是将值存储在文本文件或数据库中。 serialize() 将非文本值转换为文本(例如二进制整数或浮点值),以便它们可以轻松地以这种格式存储,并且可以使用 unserialize() 轻松地转换回来......如果您实际查看会话文件,这是存储为序列化字符串的 $_SESSION 数组,可以在执行 session_start() 时轻松转换回 $_SESSION 数组。

【讨论】:

    【解决方案3】:

    序列化单个变量没有多大意义。序列化数组或对象更有用:

    $array = array(
         0 => 'hello',
         1 => 'there',
         'how' => 'are',
         'you' => '?'
    );
    
    $txt = serialize($array);
    echo($txt); //
    

    生产

    a:4:{i:0;s:5:"hello";i:1;s:5:"there";s:3:"how";s:3:"are";s:3:"you";s:1:"?";}
    

    您可以获取此文本字符串,将其存储在数据库中,通过电子邮件发送,将其填充到文本文件中,等等...然后稍后将其检索并使用简单的 unserialize() 将其转换回 PHP 数组打电话。

    【讨论】:

    • 如何编码一个序列化的对象并将其发送到远程 Web 服务而不是 json 或 xml,或者这很疯狂?
    • JSON 和 XML 在支持方面更加普遍——我想不出任何不直接支持或没有库来添加支持的 Web 感知语言。 PHP 的序列化更加特定于语言。并不是说您不能在(例如)Java 或 C# 中使用这样的字符串,但由于您要跨语言,不妨使用更适合的东西,例如 XML/JSON。
    • 没错,这只有在您创建自己的分布式系统而不是 Web 服务时才有用。
    【解决方案4】:

    序列化变量意味着“将其转换为字符串”。基本上,它是一种将变量转换为易于存储以备将来使用的形式的方法。

    想象一下这种情况:您有一个包含大量信息的数组。您需要将其存储在文本文件中,以备下次需要时使用。默认情况下,将数组转换为字符串会产生意外结果。例如,这样做:

    file_put_contents('file.txt', array('foo', 'bar'));
    

    将字符串foobar 放入您的文本文件中。您无法轻松地将其转换回数组。 serialize 将数组转换为:

    file_put_contents('file.txt', serialize(array('foo', 'bar')));
    // a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}
    

    这不容易阅读,但unserialize 函数可以很容易地将其转换回数组。

    【讨论】:

      【解决方案5】:

      PHP 中的序列化函数会将数据结构转换为可存储的字符串。序列化数据(例如变量、数组或对象)以存储在数据库或其他存储位置。一旦反序列化,您可以在检索后重用这些数据。这是一个例子:

      $data = array("key"=>"value");
      $serialized = serialize($data);
      
      // Shows the serialized string representing the array:
      // string(28) "a:1:{s:3:"key";s:5:"value";}"
      var_dump($serialized);
      
      $unserialized = unserialize($serialized);
      
      // Shows the original array named $data:
      // array(1) { ["key"]=>  string(5) "value" } 
      var_dump($unserialized);
      

      【讨论】:

        【解决方案6】:

        它以能够传输和存储的形式写入变量。例如,您必须在将变量写入文件、数据库或仅将其存储在 HTTP 会话中之前对其进行序列化

        【讨论】:

          猜你喜欢
          • 2011-09-04
          • 2020-07-17
          • 1970-01-01
          • 2012-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-22
          • 2010-12-26
          相关资源
          最近更新 更多