2012-09-01 108 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