您的位置:首页 > 其它

序列化(serialize)和反序列化(unserialize)以及__sleep()函数和__wakeup()函数

2014-08-25 00:12 701 查看
序列化数据就是将数据转化成一个基于文本的格式,以便存储。

__sleep()在序列化前决定哪些属性进行序列化,__wakeup()在反序列化时填充任何没有存储的。

__sleep在一个对象序列化前调用,它不接收任何参数,但会返回数组,这里可以放置需要序列化的属性,

比如下面的例子:

class Customer {

private $name;

private $credit_card_number;

public function setName($name) {

$this->name = $name;

}

public function getName() {

return $this->name;

}

public function setCC($cc) {

$this->credit_card_number = $cc;

}

public function getCC() {

return $this->credit_card_number;

}

public function __sleep() {

return array(“name”); //只有name会序列化

}

}

$c = new Customer();

$c->setName(“Stuard”);

$c->setCC(“456789″);

$data = serialize($c).”\n”;

echo $data.”\n”;

Output:

O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Stuard”;}

上面在序列化前,__sleep中指定了只有name属性会序列化,而creaditcard不会。

而__wakeup则相反,它是在反序列化前触发的,比如下面例子:

class Customer {

private $name;

private $credit_card_number;

public function setName($name) {

$this->name = $name;

}

public function getName() {

return $this->name;

}

public function setCC($cc) {

$this->credit_card_number = $cc;

}

public function getCC() {

return $this->credit_card_number;

}

public function __sleep() {

return array(“name”);

}

public function __wakeup() {

if($this->name == “Stuart”) {

//重新在数据库中获得

$this->credit_card_number = “1234567890123456″;

}

}

}

$c = new Customer();

$c->setName(“Stuart”);

$c->setCC(“1234567890123456″);

$data = serialize($c).”\n”;

var_dump(unserialize($data));

Output:

object(Customer)#2 (2) {

["name:private"]=>

string(5) “Stuart”

["credit_card_number:private"]=>

string(16) ’1234567890123456’

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: