PHP类序列化/反序列化混淆

时间:2012-09-01 08:32:56

标签: php serialization instantiation

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

我目前正在开发一个关于PHP的独立项目,我创建了一个类来显示一个问题供稿,其中包含投放前端HTML的方法,处理部分也写在同一个类中。

仅举例来说,我概述的课程如下

class QuestionFeed{
    protected $vars;

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

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

我有一个页面显示插入部分的前部和单独的页面。所以很自然地,我必须首先在显示页面实例化该类,然后再在处理页面实例化。 此时,可以以任何方式序列化对象吗?如何?

2 个答案:

答案 0 :(得分:2)

当您需要保存对象的状态以供以后使用时,序列化对象非常有用。例如,您可能拥有一个保持用户首选项等的用户对象。由于Web是无状态的,因此每次请求都会丢失该对象。但是,如果您要序列化该对象并将其保存在会话变量中,则可以通过对其进行反序列化来重构该对象,从而使您不必重新构建上一次请求期间已有的新对象。

旁注:序列化然后反序列化对象也将完成对象的深层复制,其中(clone)只执行浅拷贝。

序列化示例

<?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,以便在对象恢复后可以执行一些其他任务。

答案 1 :(得分:0)

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

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