魔术方法__sleep(),__wakeup()

  这两个方法是在对象的序列化与反序列话里使用的,当序列化serialize对象时,可以把对象里的属性和方法转换成连续的bytes数据,保存在一个文件里或者在网络上传输,当需要使用这个对象时,就可以反序列话unserialize这个字符串,得到这个对象,然后继续使用。

  当对一个对象序列化时,php就会调用__sleep方法(如果存在的话),在反序列化时,php就会调用__wakeup方法(如果存在的话)。__sleep这个方法可以用于清理对象,并返回一个包含对象中所有变量名称的数组。如果该方法不返回任何内容,则NULL被序列化,导致一个E_NOTICE错误。在反序列化unserialize时,会检查是否存在__wakeup方法,如果存在,则会调用__wakeup方法,预先准备对象数据。

  __sleep() 方法常用于提交未提交的数据,或类似的清理操作。同时,如果有一些很大的对象,但不需要全部保存,这个功能就很好用。__wakeup 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

  例如连接数据库

<?php
class Connection 
{
    protected $link;
    private $server, $username, $password, $db;
    
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;
        $this->username = $username;
        $this->password = $password;
        $this->db = $db;
        $this->connect();
    }
    
    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);
        mysql_select_db($this->db, $this->link);
    }
    
    public function __sleep()
    {
        return array('server', 'username', 'password', 'db');
    }
    
    public function __wakeup()
    {
        $this->connect();
    }
}
?>

下边这个例子更明显

class user {
    public $name;
    public $id;

    function __construct() {    // 给id成员赋一个uniq id
        $this->id = 123;
    }

    function __sleep() {       //此处不串行化id成员
        return(array('name'));
    }

    function __wakeup() {
        $this->id = 456;
    }
}

$u = new user();
$u->name = "Leo";
$s = serialize($u); //serialize串行化对象u,此处不串行化id属性,id值被抛弃
$u2 = unserialize($s); //unserialize反串行化,id值被重新赋值

print_r($u);
print_r($u2);

 

posted @ 2018-05-31 11:04  kacha886  阅读(5604)  评论(0编辑  收藏  举报