2012-09-01 26 views
0

我不明白如何序列化帮助我编写高效的PHP 应用程序PHP类序列化/反序列化混淆

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

只是一个例子我概括类是如下

class QuestionFeed{ 
    protected $vars; 

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

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

而且我有一个页面,显示前部和一个单独的页面插入部分。所以很自然地,我必须首先在显示页面再次在处理页面实例化类。 在这一点上,可以序列化对象有什么帮助吗?如何?

回答

2

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

在旁注:序列化,然后反序列化一个对象也将完成一个对象的深层副本,其中(克隆)将只执行浅拷贝。

系列化

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

+0

注意:您需要使用__sleep和__wakeup魔术功能才能像我描述的那样工作。更多信息在这里:http://php.net/manual/en/language.oop5.magic.php – 2012-09-01 16:53:20

+0

假设我在上面的例子中设置了属性'$ vars'的值。我想重新使用其他页面中的值。序列化是否有助于重用该值? – cipher

+0

我刚刚给我的答案增加了一个例子。这表明你确实可以在其他页面上使用你的财产。 – 2012-09-02 18:17:58

0

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

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

+0

不仅是数组,它还用于将对象存储到单个字符串中。因此,我正在寻求帮助 – cipher