php中__sleep和__wakeup

  在php中,__sleep和___wakeup是两个分别自对象序列化前和后分别调用的方法,
其中__sleep在一个对象序列化前调用,它不接收任何参数,但会返回数组,这里可以放置哪些属性需要序列化,比如下面的例子:

Java代码  收藏代码
  1. class Customer {  
  2.  private $name;  
  3.  private $credit_card_number;   
  4.    
  5. public function setName($name) {  
  6.  $this->name = $name;  
  7.  }  
  8.    
  9. public function getName() {  
  10.  return $this->name;  
  11.  }  
  12.    
  13. public function setCC($cc) {  
  14.  $this->credit_card_number = $cc;  
  15.  }  
  16.    
  17. public function getCC() {  
  18.  return $this->credit_card_number;  
  19.  }  
  20.    
  21. public function __sleep() {  
  22.  return array(“name”); //只有name会序列化 }  
  23.    
  24. }  
  25.    
  26. $c = new Customer();  
  27.  $c->setName(“Stuard”);  
  28.  $c->setCC(“456789″);  
  29.    
  30. $data = serialize($c).”\n”;  
  31.  echo $data.”\n”;  
  32.    
  33. Output:  
  34.  O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Stuard”;}  



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

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

Java代码  收藏代码
  1. class Customer {  
  2.  private $name;  
  3.  private $credit_card_number;   
  4.    
  5. public function setName($name) {  
  6.  $this->name = $name;  
  7.  }  
  8.    
  9. public function getName() {  
  10.  return $this->name;  
  11.  }  
  12.    
  13. public function setCC($cc) {  
  14.  $this->credit_card_number = $cc;  
  15.  }  
  16.    
  17. public function getCC() {  
  18.  return $this->credit_card_number;  
  19.  }  
  20.    
  21. public function __sleep() {  
  22.  return array(“name”);  
  23.  }  
  24.    
  25. public function __wakeup() {  
  26.  if($this->name == “Stuart”) {  
  27.   //重新在数据库中获得   
  28.  $this->credit_card_number = “1234567890123456″;  
  29.  }  
  30.  }  
  31.  }  
  32.    
  33. $c = new Customer();  
  34.  $c->setName(“Stuart”);  
  35.  $c->setCC(“1234567890123456″);  
  36.    
  37. $data = serialize($c).”\n”;  
  38.  var_dump(unserialize($data));  
  39.    
  40. Output:  
  41.  object(Customer)#2 (2) {  
  42.  ["name:private"]=>  
  43.  string(5) “Stuart”  
  44.  ["credit_card_number:private"]=>  
  45.  string(16) ’1234567890123456³  
  46.  }  


   上面的代码中,因为序列化时使用了__sleep,沒把creadit cardnumber属性序列化,因此在反序列化unserialize调用前,会先调用__wakeup方法,比如这里可以重新在数据库中取得数据,再此进行操作

posted @ 2012-07-11 09:41  ctou45  阅读(180)  评论(0编辑  收藏  举报