PHP中的序列化

接口

Serializable {
    abstract public string serialize (void);
    abstruact public void unserialize (string $serialized);
}

序列化简述:

  使用serialize()保存对象中的所有变量,当对象被摧毁的时候,可以使用unserialize()重造对象。事实上,我们不需要保存对象中的方法,方法并不含有对象的属性。

  使用serialize和unserialize之前,必须事先定义要序列化的对象所属的类。

  serialize()会返回一个包含对象变量及其值的字符串。我们可以把该字符串保存到文件中,以便日后使用。

<?php
//classa.inc:
    class A {
        public $one = 1;
        
        public function show_one() {
            echo $this->one;
        }
    }

//page1.php
    include ("classa.inc");
    
    $a = new A;
    $s = serialize($a);
    file_put_contents('store', $s);

//page2.php:
include ("classa.inc");
$s = file_get_contents('store');
$a = unserialize($s);

$a->show_one();

 

 

 

再看看__sleep()和__wakeup()两个magic函数。

  如果你的类中包含__sleep()函数,serialize()序列化之前会先调用__sleep()函数。__sleep()函数应该返回一个包含所有应当序列化的变量名的数组。如果__sleep()什么也不返回,序列化时会发出E_NOTICE错误。注意:私有变量无法被序列化,否则发出E_NOTIC错误。(或者可以自行实现Serializable接口)

  与之相反,unserialize()会检查__wakeup()函数,如果有这个函数,则调用他。__wakeup()函数被用来重新构造object拥有的任何资源。可以用来重新建立数据库连接。

<?php
class Connection
{
    protected $link;
    private $dsn, $username, $password;
    
    public function __construct ($dsn, $username, $password)
    {
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->connect();
    }

    private function connect()
    {
        $this->link = new PDO ($this->dsn, $this->username, $this->password);
    }


    
    public function __sleep()
    {
    //返回需要序列化的变量名
        return array('dsn', 'username', 'password');
    }
      
    public function __wakeup()
    {
        $this->connect();
    }
}
?>

 

posted @ 2016-08-09 15:50  三复苏  阅读(387)  评论(0编辑  收藏  举报