0

我没有得到序列化如何帮助我编写高效的 PHP应用程序

我目前正在开发一个关于 PHP 的独立项目,在那里我创建了一个类来显示一个问题提要,其中包含抛出前端 HTML 的方法,并且处理部分也写在同一个类中。

仅举一个例子,我概述的课程如下

class QuestionFeed{
    protected $vars;

    public function throwHTML($filter_params){
        ........
    }

    public function InsertAnswers($answer_sanitized){
        .........
    }
}

我有一个页面来显示前面部分和一个单独的页面用于插入部分。所以很自然,我必须先在显示页面实例化该类,然后再在处理页面实例化该类。在这一点上,序列化对象可以在任何方面有所帮助吗?如何?

4

2 回答 2

2

当您需要保存对象的状态以供以后使用时,序列化对象很有用。例如,您可能有一个用户对象来保存用户偏好等。由于网络是无状态的,您将在每个请求中丢失该对象。但是,如果您要说序列化该对象并将其保存在会话变量中,则可以通过反序列化来重建该对象,从而使您不必重建在上次请求期间已经拥有的新对象。

附带说明:序列化然后反序列化对象也将完成对象的深层复制,其中(克隆)只会执行浅层复制。

序列化示例

<?php

class User {

    private $name = "";

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }

    public function setName($name) {
        $this->name = $name;
    }

    /*
    public function __sleep() {
        print "sleep";
    }

    public function __wakeup() {
        print "wakeup";
    }
    */
}

$user = new User("Andrew Schools");
$userSerialized = serialize($user); // usually you would save this in a session or DB
$user2 = unserialize($userSerialized);

echo $user->getName();
echo "<br />";
echo $user2->getName();
echo "<br />";
var_dump($user);
var_dump($user2);



?>

这应该打印出以下内容:

Andrew Schools

Andrew Schools

class User#1 (1) {
  private $name =>
  string(14) "Andrew Schools"
}
class User#2 (1) {
  private $name =>
  string(14) "Andrew Schools"
}

如您所见,我可以将对象恢复到序列化之前的状态。此外, __sleep() 函数在序列化开始之前触发,因此您可以进行任何清理。并且在反序列化之后调用__wakeup,以便在对象恢复后可以做一些额外的任务。

于 2012-09-01T16:50:31.283 回答
0

当我们需要将数组存储到单个字符串中时,序列化是一个过程。我主要序列化数组以存储在我的数据库中的单个字段中。

在您的代码中,我认为序列化不会有帮助。

于 2012-09-01T08:39:51.063 回答