您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php中__sleep和__wakeup

2025/3/3 4:48:52发布15次查看
在php中,__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³ }
上面的代码中,因为序列化时使用了__sleep,沒把creadit cardnumber属性序列化,因此在反序列化unserialize调用前,会先调用__wakeup方法,比如这里可以重新在数据库中取得数据,再此进行操作
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product