魔术方法__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);